2017-05-29 143 views
2

兩者有什麼區別?「Array(n)」和「[... Array(n)]」有什麼區別?

// Chrome console 

Array(2);     // [undefined × 2] 
Array(2).map(() => 1);  // [undefined × 2] 

[...Array(2)];    // [undefined, undefined] 
[...Array(2)].map(() => 1); // [1, 1] 

基於What are Array empty slots?,它似乎是有關內存分配,但爲什麼普及運營商突然引起內存在後一種情況下被分配?

+1

'[... Array(2)]'相當於'[undefined,undefined]'。這就是擴散算子所做的。 – Paulpro

+0

但['undefined×2]'不等於'[undefined,undefined]'(?) – neverendingqs

+1

不,它不是,就像你鏈接到的問題(及其重複)所說的那樣。 – JJJ

回答

4

關於Array構造

所有這些調用是等價的:

  • Array(2)
  • new Array(2)
  • var a = []; a.length = 2

他們是平等的意義上,他們所分配的內存分配,但不要c reate的索引。

Object.keys(Array(2)) // []

這就是爲什麼當你做

Array(2).map(() => 1); // [undefined × 2]

你本質上的變化沒有什麼,因爲沒有迭代發生在陣列上,由於缺乏反覆索引鍵的那map使用迭代時在陣列上。

關於傳播運營商

...運營商調用數組是內置的values()迭代器和迭代甚至缺席關鍵指標值的[Symbol.iterator]

這就是爲什麼在結果中我們有一個具有不同的未定義值和關鍵索引的新數組。

Object.keys([...Array(2)]) // ["0", "1"]

之後,map按照預期在密鑰和對應值上迭代。

相關問題