这不是逗号运算符。逗号是var 关键字语法的一部分。指定var 关键字以获取以逗号分隔的变量列表。
此功能在规范中称为VariableDeclarationList:http://www.ecma-international.org/ecma-262/7.0/index.html#sec-variable-statement
var 关键字语法指定为:
Syntax
VariableStatement[Yield]:
var VariableDeclarationList[In, ?Yield];
VariableDeclarationList[In, Yield]:
VariableDeclaration[?In, ?Yield]
VariableDeclarationList[?In, ?Yield], VariableDeclaration[?In, ?Yield]
VariableDeclaration[In, Yield]:
BindingIdentifier[?Yield] Initializer[?In, ?Yield]opt
BindingPattern[?Yield] Initializer[?In, ?Yield]
如果您不熟悉 BNF 或 RBNF 表示法。上面的规范意味着:
-
VariableStatement 定义为:
- 字符串
var 后跟VariableDeclarationList
-
VariableDeclarationList 被定义为:
- 变量声明或
- 变量声明列表,变量声明
- 注意:这是一个递归定义。基本上它定义了一个
VariableDeclaration、VariableDeclaration、VariableDeclaration 的无限列表...
-
VariableDeclaration 定义为
- BindingIdentifier 后跟可选的 Initializer 或
- BindingPattern 后跟一个初始化器
- 注意:此 BindingPattern 定义适用于新的 ES6 解构赋值 ([a,b,c] = ...)
BindingIdentifier、BindingPattern 和 Initializer 的定义在规范的其他地方指定。
BindingIdentifier的定义基本上是一个变量名。所以有效的BindingIdentifiers 是hello 或x 或y2 但不是for(因为它是一个关键字)或1k(因为它以数字开头)。
我暂时忽略BindingPattern 的定义,因为理解变量列表定义并不是绝对必要的。
Initializer 的定义是符号= 后跟一个表达式。基本上= 后跟任何 javascript 代码。
所以,VariableDeclaration(不是var 关键字,只是其中的一部分)简单定义为:
anyVariableName = anything
或
anyVariableName // remember, Initializer is optional
var 关键字定义为:
var VariableDeclaration
或
var VariableDeclaration, VariableDeclaration, VariableDeclaration ...
所以。 var 关键字语法的有效示例包括
var x;
var x = 12;
var x,
y = "hello",
z;
var x = 0,
y,
z=100;
等等
当我们包含BindingPattern 定义时,var 关键字语法的有效示例还包括:
var x=10,
[a,b,c] = [100,200,300],
i,
j;
var {x,y,z} = {x:10,y:20,z:30},
a = 2,
b,
c,
[i,j,k]=["hello","cruel","world"];
补充说明:
请注意,VariableDeclaration 也可以在没有 var 关键字的情况下发生。例如:
a = 40; // if this is the first time a is defined then it is
// automatically created as a global variable
在这种情况下,由于没有 var 关键字,因此出现的任何逗号都不会成为 var 语法的一部分。这意味着如果没有 var 关键字,逗号是逗号运算符:
a = 10, b = 50; // comma operator