通常の割り当てステートメント (たとえば、 x = 5
) は割り当てられた値 (この場合) を返すのに、変数宣言 ( )5
と組み合わせた割り当ては を返すのはなぜですか?var x = 5
undefined
Chrome ブラウザーの Javascript コンソールで次のステートメントを実行して、戻り値を取得しました。
> var x = 5;
undefined
> y = 5;
5
通常の割り当てステートメント (たとえば、 x = 5
) は割り当てられた値 (この場合) を返すのに、変数宣言 ( )5
と組み合わせた割り当ては を返すのはなぜですか?var x = 5
undefined
Chrome ブラウザーの Javascript コンソールで次のステートメントを実行して、戻り値を取得しました。
> var x = 5;
undefined
> y = 5;
5
それが言語の設計方法です。これは、ほとんどの言語と一致しています。
式のコンテキストでキーワードをundefined
使用することはできないため、変数宣言で以外のものを返すことは無意味です。var
多くの変数を一度に同じ値に設定したい場合は、割り当てをexpression
a 以外にすると便利です。statement
x = y = z = 2;
次のようにも使用できます。
x = 2*(y = z); // Set y = z, and x = 2*z
ただし、これは最も読みやすいコードではなく、おそらく次のように記述した方がよいでしょう。
y = z;
x = 2*z;
書き込むと、その値をvar x = 5;
宣言して 5 に初期化します。x
これは でありVariableStatement
、何も返しません。
ただしx=5
、expression
x に 5 を代入する です。がないためx
、JavaScript は暗黙的x
に通常のコードでグローバルを作成します
コメントやその他の回答のために、回答を編集しました。
代入演算子は何も返さない... 以下の例では、JS パーサーが最初に行うことは、y に 5 を代入することです。2 つ目は、y を x に代入することです。代入はそうではありませんreturn
(関数ではなく、JS では演算子の動作をオーバーロードするための C++ 構文がありません)。return
割り当てよりも複雑です。return
コンストラクトは値を返すだけでなく、現在のコンテキストを閉じているため、破棄されます。また、他の子がそれを使用していない場合、親コンテキスト (閉鎖パターン) を閉じています。したがって、代入演算子が値を返すことを (コメントで) 教えないでください。JS の場合の代入演算子は、言語構造のみです。
この言語構造はチェーンで役に立ちます (それが、誰もが復帰について話している理由です):
a = x = y = 5;
宣言されていない変数は、グローバル スコープでパーサーによって自動的に宣言されます。変数を明示的に宣言すると、次のように同時にチェーンで使用することはできません。
a = var x = y = 5;
上記のコードを適切に使用するには、次のようにします。
var x = y = 5;
a = x;
もちろん、コードをより明確にするために括弧を使用できますが、コードが関数のように動作するという意味ではありません。
また、あなたの例はJSコンソールでのみ機能します.JSコンソールは返されませんが、ステートメントまたは式の結果を出力します。これは、JS コンソールが変数の宣言の結果をundefined
(関数の作成時と同じ) として扱うことを意味しますfunction a() {}
。