2016-05-16 1 views
4

f3(arr2)arr2の値をのように変更しないと、arr1になりましたか?可能であれば、変更された配列を返さずにf3を期待どおりに動作させる方法はありますか?JavaScript - 配列は参照によって渡されますが、再割り当てされると失われます

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

f3のarrは参考にすぎません。それを参照する配列を変更するには、 'splice'または同様の' Array.prototype'メソッドを使用する必要があります。 – blld

答えて

2

アレイを変更する場合は、実際にアレイを変更する必要があります。変数の上に別の配列への参照を書くことはできません(その配列へのローカル参照を捨てるだけです)。

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

何も(つまり、オブジェクトまたはプリミティブあるかどうか)を渡すときには、Javascriptを行い、すべての関数の内部ながら、ちょうど等号(=)を使用してのように...新しい変数を割り当てるです

そのパラメータが関数内でどのように動作するかは、等号を使用して新しい変数を割り当てたばかりの場合とまったく同じです。これらの簡単な例を考えてみましょう。あなたは、refはでき :Link

1

をあなたは、単一のステップでそれを行うことができます:

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

これは何を求めているのではない –

+0

@BekimBacaj、何が期待しているのか聞いていますか? –

+1

これは、JavaScriptのオブジェクトが、関数引数(arr)の(ローカル)変数名に割り当てられ、グローバルなarr2が指している指示方向に反映されることを期待しています。そして、彼はなぜ尋ねているのですか? 答えは:あなたのローカルポインタは、それを学んだポインティング方向を変更する方法がありません。 arr2は[1,2,3,4]オブジェクトがどこにあるかをローカルのarrに伝えるためです。キャリアの内容を変更して情報源を変更することはできません。 –

2

引用:「はconsole.log(ARR2); // [1、 2、3、4]、期待 [2,3,4,5] "

あなたは機能F3の引数名編曲:に[2,3,4,5]配列を代入している何を期待していることは、ここで、この部分で

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

を得ていない再、arr2ではなくArr2は当然のことながら、あなたのスクリプトを通して元の状態にとどまりません。

function f3(*arr*) { *arr2* = f1(); }となります。

しかし、この回答は私の最終的なものではありません。これはどのように表示されるだけです。

関連する問題