1. ホーム
  2. javascript

[解決済み] JavaScriptの変数代入はどのように行われるのですか?

2022-12-24 19:22:15

質問

先日、JavaScriptでマスアサインメントがどのように動作するかを確認するために遊んでいました。

まず、コンソールでこの例を試してみました。

a = b = {};
a.foo = 'bar';
console.log(b.foo);

結果は、"bar"がアラートで表示されました。これは十分に公正です。 ab は、実際には同じオブジェクトのエイリアスに過ぎません。そこで私は、どうすればこの例をもっとシンプルにできるかと考えました。

a = b = 'foo';
a = 'bar';
console.log(b);

これって、ほとんど同じことですよね。さて、今回は foo ではなく bar の動作から予想されるように。

なぜこのようなことが起こるのでしょうか?

N.B. この例は、以下のコードでさらに簡略化することができます。

a = {};
b = a;
a.foo = 'bar';
console.log(b.foo);

a = 'foo';
b = a;
a = 'bar';
console.log(b);

(JavaScriptは文字列や整数などのプリミティブとハッシュを区別して扱っているのではないかと思います。ハッシュはポインタを返すのに対し、プリミティブは自分自身のコピーを返します)

どのように解決するのですか?

最初の例では、既存のオブジェクトのプロパティを設定しています。 2番目の例では、全く新しいオブジェクトを割り当てています。

a = b = {};

a そして b は同じオブジェクトへのポインタになりました。 ですから、そうすると

a.foo = 'bar';

これは b.foo と同じように ab は同じオブジェクトを指しています。

しかし!

代わりにこうすれば

a = 'bar';

ということは a は別のオブジェクトを指していると言っているのです。 これは a が以前指していたものには影響しません。

JavaScriptでは、変数への代入とプロパティへの代入は2つの異なる操作です。 変数をオブジェクトへのポインタと考えるのが最善で、変数に直接代入するときは、どのオブジェクトも変更せず、単に変数を別のオブジェクトに再指定しているに過ぎません。

しかし、プロパティへの代入は a.foo というオブジェクトを変更します。 a が指すオブジェクトを修正します。 これはもちろん、このオブジェクトを指している他のすべての参照も修正します。なぜなら、それらはすべて同じオブジェクトを指しているからです。