2017-01-09 5 views
1

ich gefunden habe, dass diese zwei unterschiedlichen Verfahren zur Herstellung eines Arrays von Arrays unterschiedlichen Verhaltensweisen zu schaffen produzieren:Erstellen von Array von Arrays unterschiedliche Verhalten

// Method 1 
for (var arr1 = []; arr.push([]) < len;) {} 

// Method 2 
var arr2 = new Array(len).fill([]) 

Die erstellten Arrays das gleiche in der Konsole aussehen, aber sie verhalten sich anders in meiner Code. Was könnte das verursachen?

+6

* nicht schaffen - wie so? – Li357

Antwort

1

Update: Während die Antwort unten technisch genau ist, und ein weiterer Unterschied zwischen den beiden Methoden ist, @ Ori Drori die Antwort ist fast sicher, was das OP sucht.

Ich nehme einen Stich, aber mehr Kontext wäre hilfreich. Normalerweise verhalten sich diese beiden Anweisungen in der Regel gleich, aber es gibt einen entscheidenden Unterschied - wenn Sie das Schlüsselwort new verwenden, ruft der Javascript-Interpreter den Array-Konstruktor auf. Wenn Sie den Array-Konstruktor überschreiben, gilt dies nur für arr2, die mit dem neuen Schlüsselwort definiert wurde. arr1 erstellt mit dem Array-Literal wäre immer noch ein Javascript-Array.

Als Beispiel lassen Sie uns sagen, dass ich den folgenden Code geschrieben:

function Array() { 
} 

Methode 1 noch funktionieren würde, aber Methode 2 zurückkehren würde eine Typeerror, dass die Füllung anzeigt, ist keine Funktion.

Interessanterweise ruft die Verwendung des Array-Literals (Methode 1) immer noch den Array-Konstruktor auf. Wenn ich also eine console.log("test"); innerhalb der Array-Konstruktion erstellte, würde dies immer noch auf der Konsole ausgegeben werden. ABER, wenn das Array-Literal (Methode 1) verwendet wird, bleibt das Objekt selbst ein Standard-Javascript-Array, auch wenn der Array-Konstruktor überschrieben wird.

3

Der Unterschied ist, dass in der ersten Methode jeder Index auf ein anderes Array zeigt, während in der Array#fill alle Indizes auf das gleiche Array zeigen.

Hinweis: Die erste Methode wird ein Array von Arrays "sie verhalten sich anders in meinem Code aber" *

var len = 3; 
 
var arr1 = []; 
 

 
// Method 1 
 
for (var arr1 = []; arr1.push([]) < len;) {} // new sub array is pushed into arr1 
 

 
// Method 2 
 
var arr2 = new Array(len).fill([]) // each place in the array is filled with a reference to the same array 
 

 
arr1[0].push(1); // push to the 1st element of arr1 
 
arr2[0].push(1); // push to the 1st element of arr2 
 

 
console.log('arr1: ', JSON.stringify(arr1)); // only the 1st sub array contains 1 
 
console.log('arr2: ', JSON.stringify(arr2)); // all sub arrays contain 1

+0

Interessant. Ich habe gegoogelt und folgendes gefunden: https://chrisrng.svbtle.com/es6-array-prototype-fill – VKK