[解決済み] JavaScriptの変数代入はどのように行われるのですか?
質問
先日、JavaScriptでマスアサインメントがどのように動作するかを確認するために遊んでいました。
まず、コンソールでこの例を試してみました。
a = b = {};
a.foo = 'bar';
console.log(b.foo);
結果は、"bar"がアラートで表示されました。これは十分に公正です。
a
と
b
は、実際には同じオブジェクトのエイリアスに過ぎません。そこで私は、どうすればこの例をもっとシンプルにできるかと考えました。
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
と同じように
a
と
b
は同じオブジェクトを指しています。
しかし!
代わりにこうすれば
a = 'bar';
ということは
a
は別のオブジェクトを指していると言っているのです。 これは
a
が以前指していたものには影響しません。
JavaScriptでは、変数への代入とプロパティへの代入は2つの異なる操作です。 変数をオブジェクトへのポインタと考えるのが最善で、変数に直接代入するときは、どのオブジェクトも変更せず、単に変数を別のオブジェクトに再指定しているに過ぎません。
しかし、プロパティへの代入は
a.foo
というオブジェクトを変更します。
a
が指すオブジェクトを修正します。 これはもちろん、このオブジェクトを指している他のすべての参照も修正します。なぜなら、それらはすべて同じオブジェクトを指しているからです。
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる