カンマ演算子 (Comma Operator)
JavaScript
1p = document.createElement("p"),
2a.href = json[i].link,
3a.target = "_blank";
カンマ演算子の性質を踏まえるなら、利用する価値があります。
具体的には、
- アロー関数の略式文法でbodyを一つの式文
a, b, c
にする
- 代入文の右辺に持っていき、一つの文にする
など。
一つの文しか求められない場所で使うのがポイントです。
カンマ演算子は誤解されやすい
よくある誤解は var
文、let
宣言内のカンマを「カンマ演算子」と誤認するパターンで、それはカンマ演算子ではありません。
単一の式でなければならない位置で複数の式を記述したい場合に、カンマ演算子を使うことができます。この演算子が最も良く使われるのは、for ループで複数のパラメータを与えたい時です。
これは条件付きで正しいですが、
JavaScript
1for (var i = 0, j = 9; i <= 9; i++, j--)
2 document.writeln("a[" + i + "][" + j + "] = " + a[i][j]);
このコードを例示するなら、誤りです。
var
から始まる記述は「式」ではありません。
let 宣言
理解力がなく理解しきれていないのですが、「カンマ演算子」は let var などではなく、感までまとめて指定できる。let a = 1, b = 2 , c = 3; は良くなく、forループなどで使う場合のみ使う。ということでしょうか。
質問の前段部分に言及しているつもりはありませんでした。
let宣言はECMAScriptによって、文法(Syntax)が定義されています。
http://www.ecma-international.org/ecma-262/9.0/#sec-let-and-const-declarations
**Syntax**
LexicalDeclaration[In, Yield, Await]:
LetOrConstBindingList[?In, ?Yield, ?Await];
LetOrConst:
let
const
BindingList[In, Yield, Await]:
LexicalBinding[?In, ?Yield, ?Await]
BindingList[?In, ?Yield, ?Await],LexicalBinding[?In, ?Yield, ?Await]
LexicalBinding[In, Yield, Await]:
BindingIdentifier[?Yield, ?Await]Initializer[?In, ?Yield, ?Await]opt
BindingPattern[?Yield, ?Await]Initializer[?In, ?Yield, ?Await]
上記によれば、BindingList
によって、カンマが定義されており、カンマ演算子(Comma Operator)が入る余地はありません。
一方、Initializer
を追いかけると、Expression
(式)を経由し、カンマ演算子(Comma Operator)にも行き着きます。
http://www.ecma-international.org/ecma-262/9.0/#sec-comma-operator
従って、下記コードではカンマ演算子が使われていません(let宣言の文法範囲内)が、
JavaScript
1let a = 1, b = 2;
下記コードではカンマ演算子が使われています。
JavaScript
1let a = (1,2,3);
文法を読むのは、慣れが必要なので、無理せず、少しずつ読み進めることをお勧めします。
下記3つの要素に分類すると、多少は読みやすくなると思います。
- 宣言 (Declaration)
- 文 (Statement)
- 式 (Expression)
下記リンク先が比較的よくまとまっていますが、「関数宣言(文)」と書かれており、宣言と文の違いが明確化されていないようです。
https://asciidwango.github.io/js-primer/basic/statement-expression/
Re: 2001Y さん
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/24 11:52