2016-06-13 9 views
2

Ich verwende Array.fill, um ein Array mit anderen Arrays vorzufüllen. Das Ändern des Arrays von einem Index ändert auch das Array eines anderen. Das heißt, es ist das gleiche Objekt.Array.fill verwendet das gleiche Objekt für alle Indizes

Ich habe durch einige Dokumentation gelesen, aber ich sehe dieses Verhalten nirgendwo erwähnt. Das Gleiche passiert mit einem Objektliteral.

Macht das irgendwie Sinn?

+0

Dies beantwortet Ihre Frage nicht, aber wenn Sie dieses unerwartete Verhalten lösen möchten, können Sie Array.from ({length: 2},() => []); um das Array vorzufüllen. https://jsfiddle.net/qf8z69ma/ –

+0

@JoseHermosillaRodrigo Yep, das war die gleiche Antwort, die ich zu kommen kam. – Geuis

Antwort

3

Ja, tut es.

Sie übergeben einen Verweis auf eine erstellte Objektinstanz. Wenn Sie zuerst das Array deklarieren (zB var c = []) und dann arr damit füllen würden, würden Sie das gleiche Verhalten bekommen.

const c = []; 
const arr = Array(2).fill(c); 

c.push("a");  
c.push("b"); 

// c ["a", "b"] 
// arr [reference to c, reference to c] => [["a","b"], ["a", "b"]] 
+1

Cool danke für die Überprüfung. Ich dachte mir, dass das passierte, war mir aber nicht sicher, ob das das richtige Verhalten war. – Geuis

1

Ja, es macht Sinn.

fill erwartet einen Wert, der in alle Indizes eingegeben wird, keine Funktion, die für jeden Index einen neuen Wert erzeugt. Und es klont den Wert, den Sie übergeben haben, nicht implizit (keine Standardfunktion tut das). Dies ist nur das übliche Zuweisungsverhalten, bei dem Objekte (Referenzwerte) gleich bleiben.

Verwandte Themen