1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

変数をコピーした時の値 vs 参照

Last updated at Posted at 2020-05-31

まだまだ完璧に理解しているとは言えないのですが、
フォルダの例えですっきりしたのでシェアします。

ひとつの変数から他の変数に中身をコピーしたい場合、
ざっくり言うと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も変わってしまう。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?