2014-01-25 40 views
6

我細讀underscore.js annotated source當我遇到這樣的:什麼時候obj.length不等於+ obj.length?

if (obj.length === +obj.length) {...} 

我現在從this stackoverflow question的加號(+)運算符返回對象的數字表示知道了。

也就是說,obj.length返回一個數字。 obj.length何時會不等於+obj.length

+5

它確保長度保存一個實際的數字而不是一個代表數字的字符串..(*因爲它使用'==='來檢查類型*)。通過這種方式,它可以增強對傳遞給它的具有「長度」屬性的隨機對象的保護。 –

回答

1

時,例如:

var obj = { 
    0: 'first', 
    length: '1' 
}; 

alert(obj.length === +obj.length); 

下劃線的each是一個通用的,因此可以用比其他array其他對象。就像ECMA5 forEach

forEach函數是有意通用的;它不要求它的這個值是一個Array對象。因此可以將其轉換爲其他類型的對象以用作方法。 forEach函數是否可以成功應用於主機對象取決於實現。

因此下劃線正在檢查對象的length屬性的有效性。並且他們認爲該對象的迭代方法arrayLike僅在對象的length返回的number不是NaN,而且當然不是string。因此,在我上面的示例中,如果沒有本地/多填充forEachobj將落入其迭代keys

5

===運算符在檢查時不會進行任何類型轉換,因此即使'5' == 5不同類型的數據也會立即返回false。正如你所說的+將對象轉換爲數字。如果您將一個數字轉換爲數字,它仍然是一個數字,所以您基本上檢查您的object.length是否存在並且是一個數字。像undefined,NaN,null,string等值將返回false。你不知道所有與obj會發生什麼,所以你必須檢查......

+0

數字原語 - 數字對象會導致它爲假。 – gsnedders

+0

數字對象是一個對象,而不是一個數字,認真花花公子 –

+0

那麼你*可以*做'新數字(num)',但這很愚蠢 – scrblnrd3

相關問題