2017-06-19 2 views
0

Modifizieren in einer Funktion ein Array, auf die sie

function nextInLine(arr, item) { 
 
    arr.push(item); 
 
    var removedItem = arr.shift(); 
 
    return removedItem; 
 
} 
 

 
// Test Setup 
 
var testArr = [1,2,3,4,5]; 
 

 
// Display Code 
 
console.log("Before: " + JSON.stringify(testArr)); 
 
console.log(nextInLine(testArr, 6)); 
 
console.log("After: " + JSON.stringify(testArr)); //*THIS LINE HERE*

In dem obigen Code-Schnipsel übergeben wird, warum es ist, dass die dritte console.log Linie druckt [2,3,4,5,6] .. nach meiner Logik, wenn testArr ist bestanden Zu der nextInLine-Funktion wird nur eine Kopie von testArr als ein Argument übergeben. So muss die 3. console.log Zeile [1,2,3,4,5] wie es ist, unverändert drucken!

Jede Hilfe wird geschätzt. Danke.

+3

Woran denken Sie, dass das Array kopiert wird, wenn die Funktion aufgerufen wird? So funktioniert JavaScript nicht. –

+2

Mögliches Duplikat von [Ist JavaScript eine Pass-by-Reference- oder Pass-by-Value-Sprache?] (Https://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass -by-value-language) – david

Antwort

1

In Javascript

Objekte werden als Referenz übergeben. Array ist nur ein Objekt.

So, während Sie Array an die Funktion sind vorbei, es ist eigentlich eine Referenz auf das äußere Array übergeben, die dann

var a = [1,2,3,4,5]; 

var b = a; 

b[0] = 2; 

console.log(a); //outputs [2,2,3,4,5] 

bearbeiten b tatsächlich eine geändert wird wird bearbeiten aktualisieren, da b zeigen an den Speicherort eines

+0

Das klärt einfach auf! Danke. – iamrkcheers

0

JavaScript ist Pass-by-Referenz, wenn Sie ein Array oder Objekt senden. Ref: Is JavaScript a pass-by-reference or pass-by-value language?

Um Ihr Problem zu lösen, würde nextInLine(testArr.slice(), 6) eine Kopie des Arrays erstellen.

+0

In allgemeinen Programmierbegriffen bedeutet "Durch Verweis übergeben", dass die Funktion den Wert der externen Variablen ändern kann, was in JS nicht möglich ist. Alle JS-Argumente werden nach Wert übergeben, aber im Fall von Objekten/Arrays ist der Wert eine Referenz. – nnnnnn

+0

das ist, was im Fall von OP geschieht – gauravmuk

+0

"Pass by reference" ist nicht das, was passiert, denn wenn die Funktion 'arr = null 'sagt, würde das die' testArray'-Variable überhaupt nicht beeinflussen. Aber das Argument 'arr' erhält einen Verweis auf dasselbe Objekt, auf das 'testArray' verweist, damit es * das * spezifische Objekt mutieren kann. – nnnnnn

0

In JavaScript, wenn Sie dies tun: var x = y wo y ist ein Objekt, x ist nun ein Zeiger auf y. Also, wenn Sie dies tun: x.foo = 5, y hätte auch foo gleich 5. Aber, wenn Sie dies tun: x = 10, würde es keinen Einfluss y, weil Sie einen neuen Wert zu x zuweisen.

Beachten Sie auch, dass ein Array ist ein Objekt in Javascript, so dass Ihre Situation erklärt. Weiteres Beispiel (ähnlich Ihren Fall):

var y = []; 
var x = y; 
x.push(5); 
console.log(x); [5] 
console.log(y); [5] 
x = 10; 
console.log(x); 10 
console.log(y); [5] 

Für weitere Informationen, lesen Sie this SO answer.

0

Wie hier bereits erwähnt, dass alle Objekte in Javascript (einschließlich Arrays) durch Referenz in Funktionen übergeben werden. Wenn Sie also die Funktion testArr an die Funktion nextInLine übergeben, mutiert die Funktion das ursprüngliche Array mit der Anweisung arr.push(item);.

Wenn Sie dies jedoch verhindern möchten, können Sie entweder eine Kopie/Klon von testArr in die Funktion übergeben. Der einfachste Weg, um eine Kopie des Arrays zu machen, ist wie folgt:

var testArr = [1,2,3,4,5]; 
var copyOfTestArr = testArr.slice(0); 

Alternativ können Sie die nextInLine Funktion unveränderlich machen, indem nicht die ursprünglichen Argumente wie folgt mutiert:

function nextInLine(arr, item) { 
    var removedItem = arr.concat([item]).shift(); 

    return removedItem; 
} 

// Test Setup 
var testArr = [1,2,3,4,5]; 

// Display Code 
console.log("Before: " + JSON.stringify(testArr)); 
console.log(nextInLine(testArr, 6)); 
console.log("After: " + JSON.stringify(testArr)); //*THIS LINE HERE* 
Jetzt

, wenn Sie testen Sie diese neue Funktion, sollten Sie die erwartete Ausgabe erhalten.

Verwandte Themen