2016-05-04 12 views
-1

で配列をコピー:私は01を期待している間にトラブルので、私は、配列JavaScriptの「コピー」で、この奇妙な問題を抱えているJavaScriptの

var a = [0]; 
 
var b = a; 
 
b[0]++; 
 
alert(a); 
 
alert(b);

アラート11として私を与えます。

私は配列をコピーするsliceを使用している場合は正常に動作します:

var a = [0]; 
 
var b = a.slice(0); 
 
b[0]++; 
 
alert(a); 
 
alert(b);

なぜこれがそうですか?

私はこの問題を私に説明するために全く何も見つかりませんでした。

+0

何が得られないのですか?あなたは「a」と「b」は同じことだと言った。同じものへの2つの "ポインタ"。後者の場合、元のものをコピーして新しいものを作成するのに対し、2つの異なるものへの2つのポインタがあります。 –

+1

最初のケースでは、変数の参照を2番目の変数に割り当てたので、値は両方でインクリメントされます。 2番目のスライスでは、sliceは最初の配列の浅いコピーを作成し、同じ値をインクリメントしませんでした。 – gurvinder372

+1

ES6では を使用します。b = [... a] –

答えて

2

配列は、メモリ内の配列へ参照です。単純な値(数値や文字列など)とは異なり、arr2 = arr1のような文は、配列の「値」ではなく、バージョンの参照をメモリに単にコピーします。

slice()は実際に呼び出された配列の一部(この場合はすべて)から新しい配列を作成します。そのため、2番目の例が異なって動作します。

一般に、何らかの操作を行うアレイの新しいコピーが必要な場合は、まずslice()を呼び出してコピーする必要があります。

+0

ありがとう!これはまさに私が探していたものでした。 – Simon

0

変数に別の変数を代入するように指示すると、参照渡しと呼ばれる何らかの処理が実行され、両方がメモリ内の同じオブジェクトにアクセスします。この場合、両方の変数が同じオブジェクトにアクセスするため、一方の変数を変更すると他方の変数に影響します。

これをスライスして割り当てると、値渡しとなります。つまり、代わりにその値が保存されます。この場合、1つのオブジェクトを別のオブジェクトをメモリに格納しているため、1つを変更すると、そのオブジェクトが変更されます。より多くのためにここで読む

:変数で開催されたWhat's the difference between passing by reference vs. passing by value?

+1

不完全です。 'a = [1、[2]、3]ならば? b = a.slice(0); b [1] [0] = 4;アラート(a [1] [0]); // 4 ?? ' –

0

あなたは本当にあなたがbからaを割り当てるときにあなただけの何slice、あなたがbに何かを変更したときに、あなたが実際にソースaでそれを変更しているので、aを参照している配列をコピーしていないことは、それをコピー各項目ということです新しいインスタンスへの配列で。