Site icon Amelt.net

javascriptの配列で値のコピー(値渡し)と参照渡しの挙動の違い

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のおすすめ本。