2017-05-29 8 views
2

Was ist der Unterschied zwischen den beiden?Was ist der Unterschied zwischen "Array (n)" und "[... Array (n)]"?

// Chrome console 

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

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

Basierend auf What are Array empty slots?, so scheint es auf der Speicherzuordnung verwandt zu sein, aber warum die Ausbreitung Bediener plötzlich verursacht Speicher im letzteren Fall zugeordnet werden?

+1

'[... Array (2)]' ist äquivalent zu '[undefined, undefined]'. Das macht der Spread-Operator. – Paulpro

+0

Aber '[undefined × 2]' ist nicht äquivalent zu '[undefined, undefined]' (?) – neverendingqs

+1

Nein, es ist nicht, genau wie die Frage, die Sie verlinken (und seine Duplikate). – JJJ

Antwort

4

Bezug Array Konstruktor

Alle diese Anrufe sind äquivalent:

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

Sie sind gleich in dem Sinne, dass sie Speicher für die Zuordnung zuweisen , aber nicht c Erzeuge die Indizes.

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

Das ist, warum, wenn Sie

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

tun im Wesentlichen Sie nichts ändern, da keine Iteration über das Array geschieht, weil der Mangel an Iteration Indexschlüssel, die map verwendet, während über das Array iterieren.

Bezüglich Ausbreitung Operatoren

... Operator ruft die [Symbol.iterator] eine Anordnung, die die in values() Iterator und iteriert über Werte aufgebaut ist, auch mit dem abwesenden Schlüsselindizes.

Aus diesem Grund haben wir im Ergebnis ein neues Array mit eindeutigen undefinierten Werten mit Schlüsselindizes.

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

Danach funktioniert map wie erwartet, Iterieren über die Schlüssel und die entsprechenden Werte.

Verwandte Themen