IT不死旗下博客隆重开通啦,欢迎各位小伙伴们来围观 。

jQuery中的isArrayLike方法

jQuery Xueqi 1003℃ 0评论

上次each函数中看到用到了一个名叫isArrayLike的方法,顾名思义,它就是用来判断一个对象是否是类数组。
根据鸭子类型理论(duck  type),“如果它走起路来想鸭子,叫起来也像是鸭子,那么它就是鸭子 。”
那么根据该理论,我们要实现该该函数的一个简单的办法就是判断这个对象是不是用length属性,如果它有length属性,就认为它是数组。但很明显,这个方法不严谨,因为我们可以给一些对象添加length属性,那么它便成了数组。这样是不行的。
那我们来看看jQuery中是如何来实现的,为了好看一些,我写成了具名函数的形式

 

function isArraylike( obj ) {
var length = obj.length,
type =findType( obj ); //注释1

if ( isWindow( obj ) ) {//如果object是window,返回false
   return false;
}
if ( obj.nodeType === 1 && length ) {
    return true; //这里是包含子元素的DOM元素??? 节点=1 表示是元素节点
}
//某些低版本浏览器 typeof 正则的时候会返回“function”   注释2
return type === "array" || type !== "function" &&
 ( length === 0 ||
    typeof length === "number" && length > 0 && ( length - 1 ) in obj );
}

// 检查是否是window对象
function isWindow( obj ) {
        return obj != null && obj === obj.window;
        //window===window.window 返回true
}

//注释1:findType函数是返回指定对象的类型的函数
//注释2:重点看最后一句
/*
  
return type === "array" || type !== "function" &&
        ( length === 0 ||
        typeof length === "number" && length > 0 && ( length - 1 ) in obj );

/*这句话有点复杂,我们分开来看
 1.1若type==='array'直接返回true
 1.2若type!=='array'的话,如果type!=='function'为true的话开始判断括号里的内容,否则整体返回false
 1.3括号里的内容如果length===0为true若括号里整体为true,整体返回true
 1.4若length===0为false,判断typeof length==='number',如果为flase,整体返回false
 1.5如果typeof length==='number',如果为true,判断length>0,如果为false,整体返回false
 1.6如果length>0为true,判断( length - 1 ) in obj,这话的意思就是如果是类数组的对象,
其结构肯定是{0:'aaa',1:'bbb',length:2}这样的key值为数字的,所以如果是类数组对象,判断在obj里是否能找到length-1这样的key,
如果找到,整体返回true,否则整体返回false
//in就是判断一个key是否在一个obj里。比如var obj = {a:'111'},'a' in obj为true,'b' in obj为false
*/
//下一篇来看 jQuery的type方法,判断某个对象的类型

点我转到jQuery的type方法

转载请注明:凌风阁 » jQuery中的isArrayLike方法

喜欢 (7)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址