This post is also available in: 日本語 (Japanese)
javascriptの配列は基本的に参照渡し(参照の値渡し)らしいです。
値渡しや参照渡しを詳しく勉強しようと思う方は、C言語のポインタとかjavascriptの値渡し・参照渡しについて調べてみてください。
配列で値のコピー(値渡し)と参照渡しの挙動の違い
サンプル配列を任意の変数に「参照渡し」と「値渡し」した後 push("ABC") して、元のサンプル配列が変更されるかどうかのコード例です。
「参照渡し」は配列のアドレスを参照しているだけなので、var reference を変更すると var sample_array1 も変更されます。
「値渡し」は配列の値をコピーしているので、var value を変更しても var sample_array2 は変更されません。
//サンプル配列 var sample_array1 = [0, 1, 2, 3 ,4 ,5]; var sample_array2 = [0, 1, 2, 3 ,4 ,5]; //参照渡し var reference = sample_array1; reference.push("ABC"); // console.log(sample_array1); // [ 0, 1, 2, 3, 4, 5, 'ABC' ] console.log(reference); // [ 0, 1, 2, 3, 4, 5, 'ABC' ] //値渡し(コピー) var value = sample_array2.slice(); value.push("ABC"); // console.log(sample_array2); // [ 0, 1, 2, 3, 4, 5 ] console.log(value); // [ 0, 1, 2, 3, 4, 5, 'ABC' ]
javascriptのslice()の使い方
配列の値のコピー(値渡し)には基本的に slice() を使う場合が多いです。
slice() で値のコピー(値渡し)して問題が起こるときには for文 を回したりと多少面倒なことになります。
var test_array = [0, 1, 2, 3 ,4 ,5]; var a = test_array.slice(); var b = test_array.slice(1, 3); var c = test_array.slice(2 , -1); // console.log(a); // [ 0, 1, 2, 3, 4, 5 ] console.log(b); // [ 1, 2 ] console.log(c); // [ 2, 3, 4 ]
javascriptのおすすめ本。