JavaScriptを10年書いている人でも、連続代入操作_JavaScriptスキルを完全には理解していない可能性があります

WBOY
リリース: 2016-05-16 18:09:06
オリジナル
1015 人が閲覧しました
1. はじめに
コードをコピーします コードは次のとおりです:

var a = {n:1};
a.x = {n:2}; // --> これは Cai Cai です。 jQueryを見ていてソースコードを見つけたときにこの書き方を発見しました。 a.x = a = {n:2} の上の 2 番目の文は、連続代入式です。この連続代入式では、エンジン内で正確に何が起こっているのでしょうか?どのように説明されていますか?

2. 推測


推測 1: 値を左から右に割り当てます。最初に a.x に {n:2} が割り当てられますが、次に a が {n に割り当てられます。 :2} 、つまり、 a は書き換えられており、値は {n:2} で、新しい a には x 属性がないため、未定義です。手順は次のとおりです。 1, a.x = {n:2}; 2, a = {n:2}; この説明から得られる結果は実際の操作結果と一致しています。正しいようです。推測 1 では a.x が割り当てられていることに注意してください。
推測 2: 右から左に値を代入し、最初に a が {n:2} に代入され、a.x は a が書き換えられたことを発見します (以前は a は {a:1} でした)、a.x = {n:2エンジン制限 a.x 割り当て、無視されます。手順は次のとおりです:
1, a = {n:2};
2, a.x は {n:2} に割り当てられていません
は a.x = (a = {n:2} と同等です) )、つまり実行されます。最初のステップが実行されます。これは、a.x が未定義であることも説明できます。推測 2 では、a.x がまったく割り当てられていないことに注意してください。


3. 証明


グループで議論した結果、ほとんどの人はこれが推測 1 であると考え、私もそれが推測であると考えました。 2.実際、それらはすべて間違っています。参照関係は無視しました。次のように、a を指す変数 b を追加します。


コードをコピー
コードは次のとおりです。 var a = {n:1}; var b = a; // a を一時的に保存します a.x = a = {n:2};
alert(a.x);// --> 未定義
alert(b.x);/ / -- > [object Object]


a.x がまだ未定義であることがわかります (例: b.x={n:2})。ただし、 [オブジェクト Object] になります。 b は a({n:1}) を指します。a.x = {n:2} が実行された場合にのみ、b が x 属性を持つことを意味します。実際の実行プロセス: 右から左に、最初に a に {n:2} が割り当てられ、次に a.x に {n:2} が割り当てられます。
1, a = {n:2};
2, a.x = {n:2};
a.x = (a = {n:2}) と同等です。予想 2 との違いは、a.x には値が割り当てられますが、予想 2 では割り当てられていないことです。最も重要な違いは、最初のステップ a = {n:2} の a は新しいオブジェクト {n:2} を指し、2 番目のステップ a.x = {n:2} の a は {a:1} であることです。つまり、この連続ステートメント




でコード

をコピーすると、コードは次のようになります: a.x = a = {n :2}; a.x の a は {n:1} を指し、a は {n:2} を指します。以下に示すように


4: 疑問を解決する

この記事を書いた後、読んだ後まだめまいを感じる人もいるかもしれません。なぜなら、中のテキストの説明が本当に複雑だからです。この連続した代入ステートメントを初めて理解したとき JavaScriptを10年書いている人でも、連続代入操作_JavaScriptスキルを完全には理解していない可能性があります

コードをコピーします

コードは次のとおりです: var a = {n:1}; a.x = a = {n:2};
エンジンが a.x の書き換えを制限すると考えられます (a が書き換えられた後)。しかし実際にはそうではありません。指しているオブジェクトが違います。また、エンジンは a.x={n:2} の書き換えを制限しません。
ディスカッションに参加してくれた皆さん、Cai Cai、Dadai、Ruru に感謝します。この疑問は蔡蔡が最初に提起したものである。 Ru Ru は、たとえ他の人が提起した話題であっても、Rookie Hui Ya Hui グループでのあらゆる議論にとても熱心に参加し、真剣に取り組んでいます。


5: 終了


おい、また連続課題質問で終わる。 fun が実行されると、ここでの変数 b は fun の外にオーバーフローし、グローバル変数になります。考えてみたことはありますか?


コードをコピー

コードは次のとおりです。 function fun(){ var a = b = 5; fun(); alert(typeof b); // 🎜>
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート