2016-05-16 8 views
4

Im folgenden JS-Code zugewiesen, warum nicht f3(arr2) Änderung der Wert von arr2 wie f2(arr1) zu arr1 tat? Gibt es eine Möglichkeit, f3 wie erwartet funktionieren zu lassen (wenn möglich, ohne das geänderte Array zurückzugeben)?JavaScript - Array als Referenz übergeben, aber verloren, wenn

var arr1 = [1, 2, 3, 4]; 
var arr2 = [1, 2, 3, 4]; 

function f1() { 
    return [2, 3, 4, 5]; 
} 

function f2(arr) { 
    arr.push(5); 
} 

function f3(arr) { 
    arr = f1(); 
} 

f2(arr1); 
console.log(arr1); // [ 1, 2, 3, 4, 5 ] 

f3(arr2); 
console.log(arr2); // [ 1, 2, 3, 4 ], expect [2, 3, 4, 5] 
+0

arr in f3 ist nur eine Referenz, Sie sollten 'spleißen' oder verwenden Sie ähnliche' Array.prototype' Methode, um das Array, auf das es verweist, zu ändern. – blld

Antwort

2

Wenn Sie das Array ändern möchten, müssen Sie das Array tatsächlich ändern. Sie können nicht einfach einen Verweis auf ein anderes Array über die Variable schreiben (da dies den lokalen Verweis auf dieses Array einfach wegwirft).

function f3(arr) { 
    arr.length = 0; // Empty the array 
    f1().forEach(function (currentValue) { arr.push(currentValue); }); 
} 
-1

Wenn Sie etwas passieren (Ob das ein Objekt oder eine primitive sein), alle Javascript tut, ist eine neue Variable zuweisen, während innerhalb der Funktion ... genau wie mit dem Gleichheitszeichen (=)

Wie sich dieser Parameter in der Funktion verhält, ist genau so, wie er sich verhalten würde, wenn Sie gerade eine neue Variable mit dem Gleichheitszeichen zugewiesen hätten. Nehmen Sie diese einfachen Beispiele. Sie Ref: Link

1

Sie es in einem einzigen Schritt tun konnte:

Array.prototype.splice.apply(arr, [0, arr.length].concat(f1())); 

var arr1 = [1, 2, 3, 4]; 
 
var arr2 = [1, 2, 3, 4]; 
 

 
function f1() { 
 
    return [2, 3, 4, 5]; 
 
} 
 

 
function f2(arr) { 
 
    arr.push(5); 
 
} 
 

 
function f3(arr) { 
 
    Array.prototype.splice.apply(arr, [0, arr.length].concat(f1())); 
 
} 
 

 
f2(arr1); 
 
document.write('<pre>' + JSON.stringify(arr1, 0, 4) + '</pre>'); 
 

 
f3(arr2); 
 
document.write('<pre>' + JSON.stringify(arr2, 0, 4) + '</pre>');

+0

das ist nicht, was OP fragte –

+0

@BekimBacaj, was ist op erwarten/fragen? –

+1

Wie es scheint, erwartet er, dass ein JavaScript-Objekt einem (lokalen) Variablennamen des Funktionsarguments (arr) zugewiesen wird, um in der Zeitrichtung reflektiert zu werden, auf die sein globaler arr2 zeigt. Und er fragt warum? Die Antwort ist: Ihr lokaler Zeiger hat keine Möglichkeit, die Zeigerichtung desjenigen zu ändern, von dem er gelernt hat. Weil arr2 dem lokalen arr einfach sagt, wo das [1,2,3,4] Objekt ist. Sie können die Informationsquelle nicht ändern, indem Sie den Inhalt des Trägers ändern. –

2

Zitat: „console.log (arr2); // [1, 2, 3, 4], erwarten [2, 3, 4, 5] "

Der Grund, dass Sie a re nicht bekommen, was Sie erwarten, ist dieser Teil hier

function f3(*arr*) { *arr* = f1(); }

Sie zuweisen das Array [2,3,4,5] zu dem Argument-Namen arr der Funktion f3, nicht zum arr2. Arr2 bleibt natürlich unberührt und in seinem ursprünglichen Zustand in Ihrem Skript.

function f3(*arr*) { *arr2* = f1(); } wird es tun.

Aber diese Antwort ist nicht mein Finale. So sieht es nur aus.