値渡しと、参照渡し
【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム
【プリミティブ型の値を変数に代入する】
プリミティブ型の値
→数値、文字列、真偽値( true など)、 undefined 、 null 、シンボルなどを言う。
変数 a を宣言し、数値の 10 を代入する
let a;
a = 10;
数値の 10 が保管される場所が確保され、そのアドレスが変数 a に保管される。
次に下記のようなプログラムを考えてみる
let a;
a = 10;
a = 20;
aに20を入れた時点で、新しく数値 20 が保管される場所が確保され、そのアドレスが変数 a に保管される。つまり、もともと入っていた値が保管されている場所に新しい値が保管されるのではなく、新しい場所が用意される点に注意!
・複数の変数に同じ値を代入する
let a, b;
a = 10;
b = 10;
数値の 10 が保管される場所が確保され、その場所の位置が変数 a に保管され、次に数値の 10 が保管される場所がもう一つ確保され、その場所の位置が変数 b に保管されます。
・変数に別の変数を代入する
let a, b;
a = 10;
b = a;
数値の 10 が保管される場所が確保され、その場所のアドレスが変数 a に保管され、次に変数 a が保管している場所のアドレスが変数 b に保管されます
以上より
プリミティブ型の値を変数に代入する場合、一時的に複数の変数が同じ値を参照することはありますが、変数に対する操作が別の変数が参照している値に影響を与えることはありません。
【オブジェクト型の値を変数に代入する】
オブジェクト型の値
→プリミティブ型の値以外のもの(配列やオブジェクト、関数、正規表現など)
・変数に値を代入したあとで別の値を代入する
変数 a を宣言し、配列の [10, 20] を代入
let a;
a = [10, 20];
→配列の [10, 20] が保管される場所が確保され、その場所の位置が変数 a に保管されます。
let a;
a = [10, 20];
a = [30, 40];
→新しく配列 [30, 40] が保管される場所が確保され、そのアドレスが変数 a に保管されます。
let a;
a = [10, 20];
a = [30, 40];
a[0] = 50;
→変数 a が参照している配列に対してインデックス 0 の要素の値を 50 に置き換え
以上より、
配列の場合は、新しく配列を作るたびに、その保管場所が作られるが、配列のインデックスの値は変わる
・実行してみる
let a;
a = [10, 20];
a = [30, 40];
console.log(a);
[30, 40]
a[0]=50;
console.log(a);
[50, 40]
オブジェクト型の値を変数に代入する場合、一時的に複数の変数が同じ値を参照することがある点はプリミティブ型の場合と同じですが、その時に例えば変数が参照している配列の要素を置き換えるなどの操作を行うと、変数に対する操作が別の変数が参照している値に影響を与える場合がある点に注意してください