2012-01-09 20 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 

也可以意味着:「長度是一個數字,而不是一個字符串」。