2016-12-02 9 views
3

Wenn ich Array.fill verwenden, um ein mehrdimensionales Array zu füllen, erhalte ich ein seltsames Verhalten, wenn sie eines der Arrays drängen:seltsame Verhalten in Array.fill

var arr = Array(2).fill([]); 
arr[0].push(5); 
console.log(arr); 
//=> prints [[5], [5]] 
+0

beide gegebenen Antworten sind großartige Beispiele dafür, warum Sie etwas über Objekte lernen sollten und wie sie funktionieren. mozilla developer network wäre ein guter Anfang, um darüber zu lernen. tbh könntest du das auch machen: 'var a = {}; (Funktion (x) {a.foo = "bar"}) (a); console.log (a.foo) ' – GottZ

Antwort

4

fill im wesentlichen dies zu tun:

var content = []; 
for (var i = 0; i < 2; i += 1) { 
    arr[i] = content; 
} 

So, Ihr Array eine Referenz auf das Array haben, werden Sie zu fill in jeder Eigenschaft bestanden haben.

2

Es klingt seltsam, aber was Ihr Code tatsächlich does erzeugt ein Array ([]) und legt eine Referenz für dieses Array in jedes der Elemente des Array(2). Wenn Sie also diese Referenz ändern, wird jedes Array geändert, das auf dieses Array verweist.

Es ist genau das gleiche wie:

var a = []; 
 
var arr = Array(2).fill(a); 
 
a.push(5); 
 
console.log(arr[0][0], arr[1][0]); 
 
a[0] = 2; 
 
console.log(arr[0][0], arr[1][0]);

Sie können sehen, dass die Werte innerhalb des arr durch die Änderung des a Array betroffen sind.