首页 > 解释jQuery中的isArraylike函数;

解释jQuery中的isArraylike函数;

function isArraylike( obj ) {
        //如果obj里面有length键,则length等于obj.lenght;否则等于false
        var length = "length" in obj && obj.length,
                //检测obj的类型
                type = jQuery.type( obj );

        //如果obj是function类型 或者是window对象 则返回false;
        if ( type === "function" || jQuery.isWindow( obj ) ) {
            return false;
        }

        //如果是dom元素,则为if(length);若length为true;则返回true
        if ( obj.nodeType === 1 && length ) {
            return true;
        }
        //如果obj的类型是"array",    //length为0,    //length的属性是number为true //length大于0;//length-1在obj里面是否存在
        return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj;
    }```
    
 在这个函数的最后一句要怎么理解呢?我参考了http://.com/q/1010000003961924
但对于多种条件的并存,还是有些难以理解。

这个我建议你去参考下js核心编程里的相关章节
大概的思路就是一个东西如果支持[]访问,有length 就可以当做数组看待 但是未必支持Array的函数 甚至用call、apply传进去也不行
那么典型的一个东西就是arguments了 这个东西支持下标访问 有length 但是不是一个数组

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

这句其实很好理解 就是多组条件判断 直到所有条件都为假就不是数组

第一个条件 元素本身就是数组
第二个条件 length存在但是为0 也就是一个空数组 那么下标访问就没太大意义了 反正循环的时候肯定是进不去的 同理你可以试试var a = {} a[0]是什么东西 这不会报错也不影响结果 那么我只要给a = {length : 0}他就是array like了
第三个条件 length必须是个数字 同时大于0 并且length-1也就是最后一个元素要存在 我个人人感觉就是个边界检查
也就是a[n-1]必须存在

【热门文章】
【热门文章】