メモと備忘録

メモや備忘録を残します

参照渡しについて

a=b

のような、代入の仕様について。

GAS(JavaScript)の場合、型によって異なる。
 値渡し:数値・文字列・真偽値、null、undefinedなどのプリミティブ型
 参照渡し:オブジェクト型

Javaの場合、値渡しのみ。
 値渡し:全て
 参照渡し:なし


ちなみに、渡し方の違いは以下のとおり

//値渡し
a=1;
a=b;
b=2;

console.log(a); //1
console.log(b); //2

//参照渡し
a={num:1}:
a=b;
b.num=2;

console.log(a.num); //2
console.log(b.num); //2

GASでオブジェクト型をコピー(値渡し)したい場合。

//オブジェクト
a={num:1}:
b={...a};
b.num=2;

console.log(a.num); //1
console.log(b.num); //2

c={name:"A"};
d={num:1};
e={...c,...d};//複数指定してもOK

//配列
a=[1]:
b=[...a];
b[0]=2;

console.log(a[0]); //1
console.log(b[0]); //2

スプレッド構文と呼ぶそう。以下もやっている事は同じ。

Object.assign({}, a);
Object.assign([], a);

入れ子の場合、上記では失敗する。
入れ子をコピーする場合

//オブジェクト
a={
num:1
{name:"A"}
}:
b=JSON.parse(JSON.stringify(a));

連想配列など、複雑な入れ子の場合はこちらの記事が参考になります。
JavaScriptで連想配列、入れ子オブジェクトのコピーの注意点【複製してもコピー元は変わらないようにしたい場合】