2016-01-26 94 views
7

我注意到,如果我這樣做:Array(n)和Array(n).fill之間的區別?

Array(n).map(() => console.log('test')) 

但是,如果我做的:

Array(n).fill().map(() => console.log('test')) 

我得到test打印出來n倍。

爲什麼會出現這種情況?如果我做Array(n).length我找回n

我注意到在REPL該Array(5)返回:

[ , , , , ]

鑑於Array(5).fill()回報:

[ undefined, undefined, undefined, undefined, undefined ]

在兩種情況下,任何typeof元件陣列=== undefined英寸

那麼,這是怎麼回事?

回答

10

map只對數組的已定義整數屬性進行操作。 Array(n)不設置整數屬性,而Array(n).fill()。有一個不存在和一個現存的屬性,其值是undefined屬性之間的差異。

Array(n)設置數組的屬性length,但它沒有設置任何屬性。數組對象沒有任何整數屬性。

.fill將數組的所有整數屬性從零設置爲小於length。當你做Array(n)時,你設置新的aray的length屬性,然後.fill()定義並設置每個整數屬性高達n-1。由Array(n).fill()創建的數組的屬性定義高達length - 1。 (屬性碰巧被設置爲undefined,因爲你沒有一個參數傳遞給fill,但他們確實存在。)

在pracitcal方面,你可以看到區別,如果你這樣做Object.keys(Array(4))(空數組)與Object.keys(Array(4).fill()) (字符串列表"0""3")。在第一種情況下,屬性不存在;在第二種情況下他們這樣做。

3

Array(n)創建大小爲n的新的數組,其內容還沒有被定義。

Array(n).fill()創建數組的大小n,其中每一個元素都設置爲任何你傳遞到填充或因爲你沒有經過你的情況不確定。

Array(n).fill('test')創建大小n填充有「測試」的陣列。

相關問題