在underscore.js源代码的_.each方法中,他们使用了obj.length === + obj.length。在第一个其他如果条件。他们为什么使用这个+运算符,它的重要性是什么?
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 (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
答案 0 :(得分:6)
+
运算符将其参数转换为数字。然后,他们使用“与”===
“完全相同”来对结果进行obj.length
测试。
它的实际含义是,只有当obj.length
是数字而不是(例如)字符串"3"
时,测试才会成功。
答案 1 :(得分:3)
一元+
运算符会将一个字符串强制转换为一个数字,以便可以使用更快的===
运算符来对抗已知为数字的左侧参数。
e.g。
s = "123";
i = 123;
i === s; // false
i === +s; // true
答案 2 :(得分:3)
obj.length can be any type even undefined.
+obj.length is always a number.
因此,此代码检查length属性是否存在且是否为数字。检查的原因是_.each()接受数组和非数组对象。在数组的情况下,长度属性是迭代其元素所必需的,而for..in循环是非数组对象的方法。