最后,我浏览了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
答案 0 :(得分:0)
+ obj.length将返回一个数值。 ===比较对象的类型及其值。换句话说,它执行严格的比较。
答案 1 :(得分:0)
这一行:
else if (obj.length === +obj.length) {
是必要的,因为
typeof []
将返回
object
答案 2 :(得分:0)
each
方法接受集合(数组或对象)。
在检查本机方法forEach是否可用后,该方法检查obj
是否为数组。使用typeof
无法做到这一点,因为typeof将为数组和对象返回"object"
(try typeof [] === typeof {}
)。因此,他们使用了obj.length === +obj.length
方法。
这是有效的,因为如果obj
没有length
属性,+obj.length
会返回NaN
并且严格比较失败。然后,该方法假设obj
是object
。