Javascript Triple等于js中的比较和数组长度
最后,我通过浏览代码来学习JavaScript习惯用法,我发现了Javascript Triple等于js中的比较和数组长度,javascript,underscore.js,Javascript,Underscore.js,最后,我通过浏览代码来学习JavaScript习惯用法,我发现了每个函数的以下定义: var each = _.each = _.forEach = function(obj, iterator, context) { if (obj == null) return; if (nativeForEach && obj.forEach === nativeForEach) { obj.forEach(iterator, context); }
每个
函数的以下定义:
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;
}
}
}
};
+obj.length将返回一个数值。==比较对象的类型及其值。换句话说,它执行严格的比较 这一行:
else if (obj.length === +obj.length) {
是必要的,因为
typeof []
会回来的
object
每个
方法都接受集合(数组或对象)
检查本机方法forEach是否可用后,该方法检查obj
是否为数组。这不可能使用typeof
,因为typeof将为数组以及对象返回“object”
(请尝试typeof[]==typeof{}
)。因此,他们使用了obj.length===+obj.length
方法
这是因为如果
obj
没有length
属性,+obj.length
返回NaN
,严格比较失败。然后,该方法假设obj
是一个对象
,这似乎是一种测试对象的长度属性是否为数字而不是NaN的方法。在ECMA_262中,我看不到长度属性必须是数字的任何地方,尽管它应该是一。函数在中间叉中看起来有缺陷,稀疏数组将在typeof
操作符?例如,typeof obj.length==“number”
?
object