(obj.length === + obj.length)在underscore.js源代码中= ===后这个+的目的是什么?

时间:2013-06-06 05:47:48

标签: javascript underscore.js

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

};

3 个答案:

答案 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循环是非数组对象的方法。