ラボ > Javascript関連:配列、オブジェクト

js 配列・オブジェクトの値渡し(ディープコピー)(JSON.parse(JSON.stringify()))

配列やオブジェクトはそのままコピーだと元も変わる

作成日:2019-07-07, 更新日:2024-02-08

基本

いったんJSONにしてから配列(オブジェクト)に戻すのが良さげ。

var oriHoge = 〇オブジェクトや配列〇;
var cpHoge = JSON.parse(JSON.stringify(oriHoge));

参照渡しと値渡し(ディープコピー)

サイトによって表現が異なるが基本、下記っぽい
・「参照渡し」と「シャローコピー」は同じ
・「値渡し」と「ディープコピー」は同じ
※「シャローコピー」はあまり見かけない。

参照渡し

▼配列やオブジェクトをそのまま変数に代入するってヤツ

var aryOri = ['鶏精', '豚精', '丸ごとシマウマ'];
var aryCpy = aryOri;

aryCpy[0] = '砂肝';
console.log(aryOri[0]); // 「砂肝」が出力
console.log(aryCpy[0]); // 「砂肝」が出力

値渡し

▼配列やオブジェクトにひと手間かけて変数に代入

var aryOri = ['鶏精', '豚精', '丸ごとシマウマ'];
var aryCpy = JSON.parse(JSON.stringify(aryOri));

aryCpy[0] = '砂肝';
console.log(aryOri[0]); // 「鶏精」が出力
console.log(aryCpy[0]); // 「砂肝」が出力

メモ

値渡しを調べると・・・色々と方法があるっぽい。
条件・環境に影響があるのか・・・昨日まで出来てたのに、今日エラーとかあるので・・・jsonがラクかな。

▼配列の値渡し1

var cp = Array.from(配列);

▼配列の値渡し2

var cp = 配列.slice(0, 配列.length);

▼配列の値渡し3

var cp = 配列.slice();

▼配列の値渡し4

var cp = 配列.concat();

▼オブジェクトの値渡し

var cp = Object.create(オブジェクト);