2017-05-29 13 views
2

2つの違いは何ですか? What are Array empty slots?に基づいて「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] 

、メモリ割り当てに関連すると思われるが、なぜ広がりオペレータが突然メモリが後者の場合に割り当てられることが原因でしょうか?

+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ではないインデックスを更新してください。

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

あなたは

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

を行う際に何の反復があるため、配列を反復処理しながら、mapが使用する反復インデックスキーの不足のため、アレイの上に起こりませんので、あなたは、本質的に、何も変更しない理由です。

拡散演算子に関して

...オペレータも存在しないキー索引と値を超えるvalues()イテレータと反復に内蔵されたアレイの[Symbol.iterator]を呼び出します。

そのため、結果にキーインデックス付きの別の未定義の値を持つ新しい配列が用意されています。

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

その後、mapは、キーと対応する値に対して予想される反復処理を行います。

関連する問題