最后我浏览了一下Underscore.js代码来学习 JavaScript 习惯用法,我发现了以下 each
函数的定义:
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (hasOwnProperty.call(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
这条线是做什么用的? (我认为这是检查传递的对象是否是数组的一种方法,对吗?如果是这样,typeof
运算符不是更好的方法吗?)
obj.length === +obj.length
最佳答案
each
方法接受集合(数组或对象)。
在检查 native 方法 forEach 是否可用后,该方法检查 obj 是否为数组。使用 typeof
是不可能的,因为 typeof 对于数组和对象都会返回 "object"
(尝试 typeof [] === typeof {}
)。因此,他们使用了 obj.length === +obj.length 方法。
这是有效的,因为如果 obj
没有 length
属性,+obj.length
返回 NaN
并且严格比较失败。然后,该方法假设 obj
是一个 object
。
关于javascript - js中三元等于比较和数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7723500/