2012-02-08 48 views

回答

30

這是另一種寫作方式if (typeof obj.length == 'number')。爲什麼他們這樣做,這是任何人的猜測。可能試圖以犧牲可讀性爲代價而變得聰明。這是不是太罕見這些天,可惜......

雖然這可能是這樣,它可以被壓縮通過minifiers(YUI CompressorClosure CompilerUglifyJS等)更多:

(a.length===+a.length)VS (typeof a.length=='number')

這樣做會節省5個字節,每個實例。

+0

保存一些PERF的代價,雖然5個字節(無論如何,在鉻)http://jsperf.com/obj-length-vs-typeof-number – j03m 2014-05-30 18:02:14

24

這測試是否objlength屬性是一個數字。

unary + operator將其操作數轉換爲數字,並且strict equality operator將結果與原始length屬性進行比較,而不執行類型強制轉換。

因此,如果obj.length是實際數字(例如不能轉換爲數字的字符串),則表達式將僅爲true

2

+obj.lengthobj.length轉爲數字。 我認爲這是爲了測試obj.length是否是一個數字。

4

我認爲他們測試的主要原因是否obj.length是一個數字 - 是將obj類型的Object與[object Array]區分開來(它也適用於String和Function對象)。 [對象對象]沒有長度屬性。

所以如果

obj = {a:1, b:2}; //obj.length = undefined 

obj.length === +obj.length 
undefined === NaN //false - you know that your obj has type Object 
// (or some other object, but not Array, !String and !Function) 
// so, you need to determine size of the obj in some way 
// or use for in loop to iterate over your obj 

問候

PS:IMO它回答的第二部分「他們爲什麼使用它」的問題

+0

謝謝,它幫助我明白爲什麼他們需要在這個測試(其中「其他」條款(使用「for ... in」循環而不是經典的「for」循環對象鍵/項)。 – 2013-02-21 09:30:48

相關問題