Ich gehe davon aus, dass ich hier etwas wirklich Dummes mache. Ich habe im Grunde ein Array, das ich an eine Funktion übergebe. Ich möchte ein Element dieses Arrays entfernen und eine Menge Dinge damit tun und dann den Rest des Arrays durchlaufen, solange sich noch Mitglieder in diesem Array befinden. Wenn das Array leer ist, möchte ich eine Schleife durchführen und das ursprüngliche Array erneut durchlaufen.
Bei der Verwendung von array.shift () tritt jedoch ein seltsames Problem auf. Es scheint die falsche Variable zu beeinflussen, wenn das überhaupt Sinn macht.
Abstraktes Beispiel wie folgt:
var originalArray = [1,2,3,4,5,6,7,8,9]
function goThroughArray(array){
var untouchedArray = array
console.log('untouched array before is ' + untouchedArray)
var insideArray = untouchedArray
console.log('inside array is ' + insideArray)
var removedNumber = insideArray.shift()
console.log('removed number: ' + removedNumber + ' from insideArray')
console.log('inside array after is ' + insideArray)
console.log('untouched array after is ' + untouchedArray)
}
goThroughArray(originalArray)
Die Konsolenprotokollausgabe ergibt:
untouched array before is 1,2,3,4,5,6,7,8,9
inside array is 1,2,3,4,5,6,7,8,9
removed number: 1 from insideArray
inside array after is 2,3,4,5,6,7,8,9
untouched array after is 2,3,4,5,6,7,8,9
Dies ist ohne Schleifen. Kann jemand erklären, warum das Ausführen von shift () im inneren Array AUCH das unberührte Array beeinflusst?
Ich würde erwarten, dass das insideArray sein erstes Mitglied verliert, das als "removeNumber" gespeichert ist, aber warum verliert das unberührte Array auch sein erstes Mitglied?
BEARBEITEN
function addOne(number){
console.log('number in is: '+number)
var original = number;
var modified = original
console.log('original before is ' + original)
console.log('modified before is ' + modified)
modified++
console.log('original after is ' + original)
console.log('modified after is ' + modified)
}
addOne(1)
Erträge:
number in is: 1
original before is 1
modified before is 1
original after is 1
modified after is 2
NEUE BEARBEITUNG
Obwohl diese Frage sehr alt ist, dachte ich mir, ich würde mit einer viel saubereren Methode aktualisieren, um diese Frage zu lösen:
JSON.parse(JSON.stringify(obj))
Erstellt eine Kopie des Objekts.
3 Antworten
In Javascript werden Objekte niemals kopiert. Wenn du schreibst
var a = [1, 2, 3, 4];
var b = a;
Sowohl a
als auch b
sind nur Zeiger auf dasselbe Array-Objekt. Wenn Sie beispielsweise a.push(99)
ausführen, sehen Sie das neue Element auch beim Dumping von b
.
Es scheint , dass Kopien mit unveränderlichen Typen wie Zahlen oder Zeichenfolgen erstellt werden:
var a = 14;
var b = a;
b = b + 3;
console.log(a); // still 14
Dies geschieht jedoch, weil der Operator +
ein neues Zahlenobjekt zurückgibt und b
an dieses neue anstelle des alten gebunden ist.
Wenn Sie eine Kopie erstellen müssen, müssen Sie dies explizit tun. Für Arrays ruft die Lösung die Methode slice
auf, die keine Parameter übergibt.
var b = a.slice(); // Makes a new independent copy of the array
Javascript wird als Wertsprache übergeben. Lesen Sie diesen Link, um weitere Informationen zu erhalten oder google es.
In diesem Fall sollten Sie Ihr Array klonen.
Versuche dies
let insideArray = untouchedArray.slice();
In JS werden Zuweisungen nach Wert ausgeführt:
var a = 1,
b = a; // 1 (by value)
a = 2;
b; // 1 (not modified)
Bei Objekten ist dieser Wert jedoch eine Referenz im Speicher. Das heißt, wenn Sie eine Eigenschaft des Objekts ändern, sehen Sie die Änderung in allen Variablen:
var obj1 = {},
obj2 = obj1;
obj1.foo = 'bar';
obj2.foo; // 'bar' (the change is reflected in the other variable)
obj1 = {}; // However, if you replace the entire object, the change
// won't be reflected because assignments are done by value
obj1.foo; // undefined
obj2.foo; // 'bar'