55

通常の割り当てステートメント (たとえば、 x = 5) は割り当てられた値 (この場合) を返すのに、変数宣言 ( )5と組み合わせた割り当ては を返すのはなぜですか?var x = 5undefined

Chrome ブラウザーの Javascript コンソールで次のステートメントを実行して、戻り値を取得しました。

> var x = 5;
undefined
> y = 5;
5
4

5 に答える 5

48

それが言語の設計方法です。これは、ほとんどの言語と一致しています。

式のコンテキストでキーワードをundefined使用することはできないため、変数宣言で以外のものを返すことは無意味です。var

多くの変数を一度に同じ値に設定したい場合は、割り当てをexpressiona 以外にすると便利です。statement

x = y = z = 2;

次のようにも使用できます。

x = 2*(y = z); // Set y = z, and x = 2*z

ただし、これは最も読みやすいコードではなく、おそらく次のように記述した方がよいでしょう。

y = z;
x = 2*z;
于 2013-04-16T01:28:02.537 に答える
3

書き込むと、その値をvar x = 5;宣言して 5 に初期化します。x

これは でありVariableStatement、何も返しません。

ただしx=5expressionx に 5 を代入する です。がないためx、JavaScript は暗黙的xに通常のコードでグローバルを作成します

于 2013-04-16T01:26:10.357 に答える
0

コメントやその他の回答のために、回答を編集しました。

代入演算子は何も返さない... 以下の例では、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() {}

于 2013-04-16T01:28:10.490 に答える