用逗号分配会起作用吗?


108

为什么aaa = 1,2,3起作用并将其值设置aaa1

为什么不起作用var bbb = 1,2,3

为什么var bbb = (1,2,3)起作用并将其值设置bbb3

控制台会话示例


9
由于语法不允许变量名称以数字开头,因此出现语法错误。var a1,a2,a3;将只声明三个局部变量。
Jared Farrish 2014年

Answers:


200

这里有很多事情要做,但是基本上,这取决于逗号运算符

逗号运算符计算两个操作数(从左到右)并返回第二个操作数的值。


这段代码:

aaa = 1,2,3

等效于:

aaa = 1;
2;
3;

因此,So aaa被隐式声明并分配值为1。请注意,控制台上的输出是最后一条语句3的结果。


这段代码:

var bbb = 1,2,3

语法错误,因为变量声明中的逗号用于在一行中声明多个变量。正如MDN文章指出的那样,

请注意,var语句中的逗号不是逗号运算符,因为它在表达式中不存在。相反,它是var将多个语句组合成一个语句的特殊字符。

因此,这段代码大致相当于:

var bbb = 1;
var 2;
var 3;

当然,2它不是有效的标识符,因此它此时将失败。


这段代码:

var bbb = (1,2,3)

与第一个非常相似,除了因为数值用括号括起来,所以它们首先被求值。因此,这相当于:

1;
2;
var bbb = 3;

17
甚至,=var bbb = 1;不一样的=作为aaa = 1;-他们(初始化器VS 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)评估为as 1; 2; a = 3并返回
3。– CompuChip

MDN对变量分配中的parens怎么说,为什么相反呢?我找不到文档
Brian

@staticx什么都没有“反向”完成。首先评估括号。就像当你有(1 + 2) * 31 + 2首先会评估,然后将该表达式的结果替换回外部表达式,以进行其余的评估。
pswg 2014年

9

逗号在Javascript中有多种用途。在表达式中:

a = 1, 2, 3;

它是一个运算符,仅返回其右手参数。但这也是var声明语法的一部分,它们是:

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

(其中[...]表示该部分是可选的)。您的var声明缺少逗号后的变量名,因此不会解析。您可以通过以下方式获得想要的效果:

var a = (1, 2, 3);

括号强制将逗号视为运算符,而不是变量声明之间的定界符。


7

在您的示例中,逗号在两种情况下使用:

var 声明

var语句的语法为:

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

在这里,逗号用于分隔变量名称/值对。由于变量名称不能以数字开头(请参见标识符名称),因此以下操作将无效:

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

逗号运算符

逗号运算符计算两个操作数(从左到右)并返回第二个操作数的值。以下表达式的工作方式如下:

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=123。逗号运算符的结果是最后一条语句3的值。但是,从OP的屏幕截图中可以清楚地看到,aaa被赋值为1。这样做的原因是运算符优先级,其中逗号运算符的优先级最低。
Tibos

1

在第一种情况下:

aaa = 1,2,3

逗号用作表达式分隔符。它执行对的赋值aaa,然后计算2并丢弃它,然后计算3并丢弃它。

在第二:

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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.