jquery源码分析之isArraylike()

在js的学习中经常见到描述一个对象为类数组对象,那么到底什么样的对象可以称为类数组对象呢?

类数组对象有两个要求:

  1. 对象有一个整数类型的length属性
  2. length属性的值大于对象中元素的最大索引

jQuery源码中isArraylike(obj)方法,字面理解像是判断对象是否是类数组对象的,我们来看一下

function isArraylike( obj ) {

    // Support: iOS 8.2 (not reproducible in simulator)
    // `in` check used to prevent JIT error (gh-2145)
    // hasOwn isn't used here due to false negatives
    // regarding Nodelist length in IE
    var length = "length" in obj && obj.length,
        type = jQuery.type( obj );

    if ( type === "function" || jQuery.isWindow( obj ) ) {//不能是函数或者window对象,因为这两者也有length属性
        return false;
    }

    if ( obj.nodeType === 1 && length ) {//如果是元素节点且有length属性,则返回真。
        return true;
    }

    return type === "array" || length === 0 ||
        typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}

isWindow: function( obj ) {
    /* jshint eqeqeq: false */
    return obj != null && obj == obj.window;
}

目前我的理解是这个方法中

typeof length === "number" && length > 0 && ( length - 1 ) in obj //数组下标为数组对象的key

这句代码是判断对象是否为类数组对象的,整个方法判断的是否是数组,类数组,带length的json,是的话就返回真

jquery对象本身就是类数组对象,含有连续的整型属性,length属性和大量的jquery方法。

下面这篇文章写得不错,很详细
http://blog.csdn.net/liangklfang/article/details/48657845