3

在underscore.js源码的_.each方法中,他们使用了obj.length === +obj.length。在第一个 else if 条件下。为什么要使用这个 + 运算符,它的意义是什么?

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;
    }
  }
}

};

4

3 回答 3

6

运算符将其+参数转换为数字。然后他们使用“完全一样”运算符===来测试obj.length结果。

obj.length它的实际意思是,只有当是数字而不是(例如)字符串时,测试才会成功"3"

于 2013-06-06T05:51:24.093 回答
3

一元运算+符会将字符串强制转换为数字,以便可以将更快的===运算符用于已知为数字的左侧参数。

例如

s = "123";
i = 123;

i === s; // false
i === +s; // true
于 2013-06-06T05:49:12.577 回答
3
obj.length can be any type even undefined. 
+obj.length is always a number.

所以这段代码检查长度属性是否存在并且是一个数字。此检查的原因是 _.each() 接受数组和非数组对象。在数组的情况下,长度属性是迭代其元素所必需的,而对于非数组对象,for..in 循环是要走的路。

于 2013-06-06T05:51:34.233 回答