まだまだ完璧に理解しているとは言えないのですが、
フォルダの例えですっきりしたのでシェアします。
ひとつの変数から他の変数に中身をコピーしたい場合、
ざっくり言うとStringとObjectで挙動が変わってしまう。
- string ... コピー元が変わらない
- object ... コピー元も書きかわってしまう
Stringの場合
Stringはプリミティブ型。メソッドを持たないデータ型。
let name1 = 'tom';
let name2 = 'tom';
console.log(name1, name2): // tom tom
name1 = 'bob'; //ここでname1を書き換える
console.log(name1, name2): // bob tom
name2 = name1; //name1(今はbob)をname2つに入れる。name1のコピーを作ってname2という名前にする
console.log(name1, name2): // bob bob
stringは中にvalueしかないから、copyしたら中身もそのままコピーする
name2 = name1
name1のbobをcopyしてname2にpasteしている感じ
コピー元のname1は変わらない。
フォルダを複製してリネームしたと考えよう
フォルダーのコピペをしていると考えると自分的には理解しやすかった。
name1というフォルダを複製してname2という名前を付けた。
name2の中身を変えてもname1フォルダには影響は受けない。
Objectの場合
stringと違ってメソッドを持つデータ型ということ。
const person1 = {
first: 'tarou'
last: 'yamada'
};
const person2 = {
first: 'hanako'
last: 'satou'
};
const person3 = person1; // person1をコピーしてperson3としたい
person3.first = 'Yuko'; // person3のfirstだけYukoにしよう。姉妹だし
console.log(person3.first); // Yuko ふむふむ
console.log(person1.first); // Yuko !!!なんでや
const person3 = person1;
このあとperson3.first = 'Yuko';
と
person3だけを変えたつもりなのに、コピー元のperson1の内容も変わってしまう。
この場合はStringのときと違って、person1の中身をコピペしてるんじゃない。
参照を作ってるだけ。
フォルダのショートカット(エイリアス)を作ったと考えよう
ようはperson1のショートカットを作った。そのショートカットの名前をperson3に変えた。
person3の中身を修正したら、person3とperson1はリンクで繋がっているので
ショートカット元のperson1も変わってしまう。