JavaScript或underscore.js中是否可能存在负对象长度?意思是什么?

6
我正在查看Underscore.js库的源代码,特别是map方法(在该页面的第85行左右,并在此处复制):
  _.map = function(obj, iterator, context) {
    var results = [];
    if (obj == null) return results;
    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
    each(obj, function(value, index, list) {
      results[results.length] = iterator.call(context, value, index, list);
    });
    if (obj.length === +obj.length) results.length = obj.length;
    return results;
  };

除了以下这行内容外,整个过程非常简单明了。
    if (obj.length === +obj.length) results.length = obj.length;

现在,我理解这句话的意思是“如果对象长度不是负数……”,
如果我的理解正确,那么它可能是负数!亲爱的专家们,请问什么类型的对象可能会是负数?
    obj.length === +obj.length 

是否为 false?我的理解是 === 可能会返回 false,如果 obj.length 的类型与 +obj.length 的类型不匹配,但在这里我的知识不足。 + 可以对 obj.length 可能的类型做什么样的事情? x === +x 是一种我不知道的通用惯用测试吗?这是对 underscore.js 深层次出现的某些特殊情况的响应吗?例如,underscore.js 是否分配并跟踪负的 object.length 以满足某些常规目的?指导和建议将不胜感激。


3
请注意,+x 不一定是正数——它只是 x 的数值。因此,如果 var x = -10,那么 +x 也是 -10 - Tikhon Jelvis
是的,要意识到 +x 对 x 的值没有做任何改变(在比较时没有临时增加它)。 - grantwparks
2个回答

4

在JavaScript中,+ 运算符也可以用于将数字的字符串表示转换为数字。因此,下面这行代码:

obj.length === +obj.length

也可以表示:"长度是一个数字,而不是字符串"。


4

我认为这是在测试看看typeof obj.length === 'number'

与其是一个具有长度值为'2 days'的对象相反

因此它知道它是否是这样的一个对象:

var obj = { app: 'doctor', length: '45 min' };

vs

var obj = [ 0, 2, 1];

我看到了 - 我想到了。如果 obj = { app: 'doctor', length: '45 min' },那么 obj.length 将是 undefined,而 +obj.Length 将是 NaN。但是如果 obj 是一个数组,那么它的长度将是一个正数,一切都会很好。所以这实际上是一个数组测试。现在的问题是“为什么不是 obj instanceof Array?” - Reb.Cabin
obj.length不会是未定义的,因为obj中有一个特定的length属性,其值为“45分钟”。但是使用它作为长度会很糟糕。 - grantwparks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接