web-dev-qa-db-ja.com

割り当てによって返される値

なぜ通常の代入ステートメント(たとえば、x = 5)割り当てられた値を返します(5(この場合)、割り当ては変数宣言(var x = 5)はundefined?を返します

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

> var x = 5;
undefined
> y = 5;
5
46
user10165

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

変数宣言がundefined以外のものを返すようにしても意味がありません。これは、式のコンテキストでvarキーワードを使用することができないためです。

割り当てをexpressionではなくstatementにすることは、多くの変数を一度に同じ値に設定する場合に便利です。

x = y = z = 2;

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

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

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

y = z;
x = 2*z;
38
Paul

var x = 5;は変数ステートメントであり、式ではありません。

このステートメントの動作は ECMAScript言語リファレンスのセクション12.2 で説明されています。

  1. VariableDeclarationListを評価します。
  2. 戻り値(通常、空、空)。

これは基本的にvoidの戻り値です。

8
Ja͢ck

代入演算子(つまり、等号)(1)は、右側のオペランド(つまり、変数、プロパティ、または関数の値または値)を左側のオペランド(つまり、変数またはプロパティ)に割り当てます。 )そして(2)代入式(たとえば、y = 10)は、式の残りの部分が評価される前に、右側のオペランド(たとえば、10)と同じ値を持つ単純なオペランドになります。これは、式が評価されるときに、呼び出された関数がその戻り値に置き換えられる場合と似ています(ただし、関数呼び出しは演算の最初であり、代入演算は14番目です)。

var x, y, z = 1;
x = z + (y = 2); // x === 3     

function returnTwo () {
    return 2;
}

x = z + returnTwo(); // x === 3

Xが3になっただけでなく、式全体が3に評価されることに注意してください。

varキーワードの目的は、変数を現在のスコープにバインドすることです。 varキーワードで宣言された変数は、それらが宣言されているスコープにバインドされます。 varキーワードは、左端の変数(またはプロパティ)を、評価された式の値への参照として割り当てます。

var fun = function () {
    var x = 1;
    var y = x + 1; 
    return y;
}

// The x and y variables are bound to the scope of the fun function.

式でvarキーワードを使用することを宣言と呼びます。宣言は、値が評価されないアクションであり、未定義でさえありません(コンソールが未定義で印刷している場合でも)。さらに、この投稿に対する他の回答が示しているように、JavaScriptが式を期待する場所に宣言を表示することはできません。

3
orb

あなたが書くときvar x = 5;xを宣言し、その値を5に初期化します。

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

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

2
Sachin

コメントと他のいくつかの回答のために私は私の回答を編集しました。

代入演算子は何も返しません...以下の例では、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() {})。

0
Karol