将各种类型或对象都转变为数组

来源:Ruby's Louvre 时间:2009-12-28 13:19:00 

jQuery的makeArray有其局限性(1.3.4还有bug),我自己实现了一个,不过涉及N多辅助方法。


var dom = {},_toString = Object.prototype.toString,_slice = Array.prototype.slice;dom.is = function(obj,type) {  return _toString.call(obj).match(/^\[object\s(.*)\]$/)[1] === type;}dom.isArray = function (obj) {  return dom.is(obj,"Array");}dom.isNumber = function (obj) {  return dom.is(obj,"Number");}dom.isString = function (obj) {  return dom.is(obj,"String");}dom.isArrayLike =  function (obj) {//包括Array  if(dom.isArray(obj) || obj.callee) return true;  if(dom.is(obj,'NodeList')) return true;  if(dom.is(obj,'HTMLCollection')) return true;  //不能为字符串,不能为window,具有length属性  if(dom.isNumber(obj.length) && !dom.isString(obj) && !obj.eval){    if(obj.nextNode || obj.item)      return true;    var n = obj.length - 1 < 0 ? 0 : obj.length - 1 ;    //如果是具有数字键或length属性的对象,如jQuery对象    if(obj.hasOwnProperty(n) && obj.hasOwnProperty(0))      return true    return false;  }  return false;}dom.toArray = function (arr) { //把普通对象变成原生数组对象  if(arguments.length === 0 || arr === null){    return [];  }else if(arr.callee){//如果是Arguments对象    return _slice.call(arr);  }else if(dom.isArray(arr)){//如果Array对象返回一个克隆    return arr.concat();  }else if(dom.isArrayLike(arr)){    try{//jQuery对象,dom对象,el.getElementsByTagName得到的HTMLCollection      //与el.childNodes得到的NodeList      return _slice.call(arr);    }catch(e){//IE用slice处理元素或节点集合会出错,只能慢慢拷贝      var ret = [], i = arr.length;      while (i) ret[--i] = arr[i]; //Clone数组      return ret;    }  }else {//普通函数,单个元素节点,字符串,数字,window对象    return [arr];  }}

早期尝试使用Ext.isIterable,不过它有点小BUG,如放一个函数进去,它会返回undefined,好歹返回false嘛,另对于用户自定义的类数组对象无法检测,残念!不过我的isArrayLike也不完美,自定义的东西随意性太大了,暂时没办法一网打尽……以后慢慢改进!

下面是测试:


 

标签:jquery,bug,数组,对象
0
投稿

猜你喜欢

  • asp的分词技术

    2007-08-25 17:50:00
  • 超长文章的智能分页-支持HTML

    2008-03-20 13:21:00
  • 理解JavaScript中的事件 Event

    2008-03-19 11:16:00
  • 实例解析:MySQL 实例管理器识别的命令

    2009-02-23 17:33:00
  • 最小asp后门程序

    2011-04-03 10:35:00
  • IE7兼容模式与兼容视图

    2010-06-28 18:48:00
  • asp如何显示一个等待或欢迎信息?

    2010-06-08 09:39:00
  • 在ASP中使用SQL语句之7:ORDER BY

    2007-08-11 12:51:00
  • 用JavaScript判断字符串长度

    2009-10-29 12:15:00
  • 分布式DBA:SQL存储过程知识总结

    2009-02-24 17:17:00
  • asp 去掉html中的table正则代码函数

    2011-04-06 10:48:00
  • DBA经验:如何进行MySQL数据库表的故障检测

    2009-02-12 17:37:00
  • javascript 获取硬盘信息代码

    2007-12-08 21:27:00
  • asp实现页面延迟运行的两个简单方法

    2007-10-16 13:49:00
  • 经验总结:修改MySQL默认密码的具体步骤

    2009-01-04 13:29:00
  • 栅格:灵活应变

    2008-07-22 12:22:00
  • 关于MySQL中隐藏空间的问题

    2009-07-30 08:15:00
  • CSS关于Border你可能会不注意的东西

    2007-10-20 13:50:00
  • 建立MySQL数据库日常维护规范

    2009-03-20 12:34:00
  • [翻译]JavaScript中对象的层次与继承

    2008-12-31 13:36:00
  • asp之家 网络编程 m.aspxhome.com