配列のコピー

Javascript 配列のコピーには「シャローコピーとディープコピー」があります。

配列の参照

【実行画面】


【Source Code】
<script type="text/javascript">
var src = ["A", "B", 1, 2];
var copied = src;
 
src[0] = 0;
copied[1] = 0;
 
document.write("src : " + src + "<br>");
document.write("copied : " + copied);
</script>

var src = ["A", "B", 1, 2]; で配列を定義して、copied = src でコピーします。
copied は src の参照(シャローコピー)で、元の src が変われば copied も変わります。
また copied は src を指しているので、copied が変われば src も変わります。
src[0] = 0;
copied[1] = 0;

JavaScript の配列で注意しなければならないことは、パラメータで渡した配列を受け取り先で変更すると元の配列にも影響が及ぶことです。
その危険を避けたいときは、ディープコピーを使って下さい。

ディープコピー

【実行画面】


【Source Code】
<script type="text/javascript">
var src = ["A", "B", 1, 2];
var copied = src.slice(0);
 
src[0] = 0;
copied[1] = 0;
 
document.write("src : " + src + "<br>");
document.write("copied : " + copied);
</script>

var src = ["A", "B", 1, 2]; で配列を定義して、copied = src.slice(0) でコピーします。
slice() 関数は配列の一部を切り出す関数ですが、0 を指定(または省略)すると全ての要素が対象になります。
参照と違って src と copied は別物です。
従って src を変更しても copied には影響しません。

slice() に代えて concat() を使うこともできます。
concat() は配列に要素を追加した配列を返すものですが、要素を追加しなければ元々の配列のコピーが返されます。
【実行画面】


【Source Code】
var src = ["A", "B", 1, 2];
var copied = src.concat();
 
src[0] = 0;
copied[1] = 0;
 
document.write("src : " + src + "<br>");
document.write("copied : " + copied);

[Next Chapter ↓]配列の追加と削除と反転
[Previous Chapter ↑]配列

前田稔の超初心者のプログラム入門
超初心者のプログラム入門(JavaScript)