解释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://segmentfault.com/q/1010000003961924
但对于多种条件的并存,还是有些难以理解。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这个我建议你去参考下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]必须存在