コンマでの割り当ては機能しますか?


108

なぜ機能しaaa = 1,2,3、の値をaaaに設定します1か?

なぜ動かないのvar bbb = 1,2,3ですか?

なぜ機能しvar bbb = (1,2,3)、の値をbbbに設定します3か?

コンソールセッションの例


9
変数名の先頭を数字にすることはできないため、構文エラーが発生します。var a1,a2,a3;3つのローカル変数を宣言するだけです。
Jared Farrish 2014年

回答:


200

ここでは多くのことが行われていますが、基本的にはコンマ演算子です。

コンマ演算子は、そのオペランドの両方を(左から右に)評価し、2番目のオペランドの値を返します。


このコード:

aaa = 1,2,3

同等です:

aaa = 1;
2;
3;

したがってaaa、暗黙的に宣言され、値1が割り当てられます。コンソールの出力は、最後のステートメント3の結果であることに注意してください。


このコード:

var bbb = 1,2,3

変数宣言のコンマは1行で複数の変数を宣言するために使用されるため、構文エラーです。MDNの記事で指摘されているように、

varステートメント内のコンマは式内に存在しないため、コンマ演算子ではないことに注意してください。むしろ、var複数のステートメントを1つに結合することはステートメントの特殊文字です。

したがって、このコードはおおよそ次のコードと同等です。

var bbb = 1;
var 2;
var 3;

もちろん、2は有効な識別子ではないため、その時点で失敗します。


このコード:

var bbb = (1,2,3)

数値は括弧で囲まれているため、最初に評価されることを除いて、最初のものと非常に似ています。したがって、これは大まかに次と同等です。

1;
2;
var bbb = 3;

17
さらに、=中にはvar bbb = 1;同じではありません=のようにaaa = 1;、彼らは文法で異なるプロダクション(AssignmentExpression対初期化子)から来て、ちょうど同じトークンを使用するように起こります- 。
Ryan Cavanaugh 2014

7
とてもいい説明。完全に明示的ではなかったのは、次のa = 1, 2, 3よう(a = 1), 2, 3に評価されるa = 1; 2; 3(そして3を返す、たとえばb = (a = 1, 2, 3)3をbに割り当てる)のように括弧で囲むことができるということです。対照的に、a = (1, 2, 3)と評価1; 2; a = 3戻り3
CompuChip

MDNは変数代入の括弧について何を言っていますか?それはなぜ逆ですか?ドキュメントが見つかりませんでした
ブライアン14

@staticx実際に「逆」に行われることはありません。括弧が最初に評価されます。の場合と同様に(1 + 2) * 31 + 2が最初に評価され、その式の結果が残りの評価のために外側の式に置き換えられます。
pswg 14

9

コンマは、JavaScriptで複数の用途があります。式では:

a = 1, 2, 3;

これは、右側の引数を返すだけの演算子です。ただしvar、これは宣言の構文の一部でもあります。

var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;

(ここ[...]で、その部分はオプションです)。あなたのvarそれは解析されませんので、宣言は、カンマの後に変数名が欠落しています。あなたはあなたが望む効果を得ることができます:

var a = (1, 2, 3);

括弧により、コンマは変数宣言間の区切り文字ではなく演算子として扱われます。


7

例では、コンマは2つのコンテキストで使用されています。

var ステートメント

varステートメントの構文は次のとおりです。

var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];

ここでは、コンマを使用して変数の名前と値のペアを区切ります。変数名の先頭を数字にすることはできないため、以下は機能しません(識別子名を参照)。

var bbb = 1, 2, 3;
// SyntaxError: Unexpected number

カンマ演算子

コンマ演算子は、そのオペランドの両方を(左から右に)評価し、2番目のオペランドの値を返します。次の式は次のように機能します。

aaa = 1, 2, 3;
  • aaa = 1, 2 利回り2
    • より優先度が高いaaa = 1ため、最初に評価されることに注意してください=,
  • 2, 3 利回り3
var bbb = (1, 2, 3);
  • 式は上記のように(1, 2, 3)生成3されます
  • 変数にbbbは値が割り当てられます3

2
aaa = 1, 2, 3=>コンマ演算子は、以下の3つのステートメントを分離するために使用される:aaa=12および3。コンマ演算子の結果は、最後のステートメント3の値です。ただし、OPのスクリーンショットから明らかなように、aaaには値1が割り当てられています。この理由は、演算子の優先順位であり、カンマ演算子の優先順位が最も低くなります。
Tibos 2014

1

最初のケースでは:

aaa = 1,2,3

コンマは式の区切り文字として機能します。への割り当てを実行しaaa、それを計算2して破棄してから、計算3して破棄します。

2番目:

var bbb = 1,2,3

varキーワードは、後に次のことというのJavaScriptコンパイラに指示します,別の変数名でなければなりません。それは見つけられていないので、死んでギャグです。

var bbb = (1,2,3)

ここでは、コンパイラーは最初にそれを評価1して無視します。次に、それを評価2して無視します。次に評価さ3れ、スタックに残されるので、bbb

式を区切るためにコンマを使用することは一般的ではありませんが、for見た目などに役立つ場合があります。

for (i = 0, l = 10; i < l; i++) {
  console.log(i);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.