2012-01-09 111 views
5

我一直在寻找的Underscore.js库的源代码,专门为map方法(围绕页面上线85,并在这里复制):负面对象的长度可能在JavaScript或underscore.js中?含义?

_.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?我对===的理解意味着如果obj.length的类型与+obj.length的类型不匹配,它可能会返回false,但这里我的知识不足。 +obj.length可能是什么种类的东西可以做什么?是x === +x某种我不知道的通用惯用测试?是否对underscore.js中出现的某种特殊情况作出了回应,例如,为了某些常规目的,下划线.js是否指定并跟踪负对象长度?指导和意见将不胜感激。

+2

请注意,'+ x' *不一定是正数 - 它只是'x'的数值。所以如果'var x = -10','+ x'也是'-10'。 – 2012-01-11 00:42:23

+0

是的,认识到+ x对x的值没有做任何事情(没有为了比较暂时增加它)。 – grantwparks 2012-03-31 22:38:07

回答

4

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

与之相对,如果它是有'2 days'

的长度值的对象,所以它知道,如果它就像一个对象:

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

vs

var obj = [ 0, 2, 1]; 
+0

我明白了 - 我想。如果'obj = {app:'doctor',length:'45 min'}'那么'obj.length'将会是'undefined','+ obj.Length'将会是'NaN'。但是如果'obj'是一个数组,那么它的长度将是一个正数,一切都会好的。所以这是一个真正的数组测试。现在的问题是“为什么不'obj instanceof Array'? – 2012-01-11 02:46:34

+0

obj.length不会被定义,因为obj中有一个特定的长度属性,它的值是'45分钟'。但是使用它作为长度。 – grantwparks 2012-03-31 22:36:49

3

在javascript中, +运算符也可用于将数字的字符串表示形式转换为数字形式。所以行:

obj.length === +obj.length 

也可以意味着:“长度是一个数字,而不是一个字符串”。