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.

2
Ross van Zyl 12 Aug. 2015 im 18:29

3 Antworten

Beste Antwort

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
3
6502 12 Aug. 2015 im 15:46

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();
1
Community 23 Mai 2017 im 12:08

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'
1
Oriol 12 Aug. 2015 im 15:44