为什么aaa = 1,2,3
起作用并将其值设置aaa
为1
?
为什么不起作用var bbb = 1,2,3
?
为什么var bbb = (1,2,3)
起作用并将其值设置bbb
为3
?
为什么aaa = 1,2,3
起作用并将其值设置aaa
为1
?
为什么不起作用var bbb = 1,2,3
?
为什么var bbb = (1,2,3)
起作用并将其值设置bbb
为3
?
Answers:
这里有很多事情要做,但是基本上,这取决于逗号运算符。
逗号运算符计算两个操作数(从左到右)并返回第二个操作数的值。
这段代码:
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;
=
在var bbb = 1;
不一样的=
作为aaa = 1;
-他们(初始化器VS AssignmentExpression)来自不同的生产在语法,只是碰巧使用了同样的道理。
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
并返回
(1 + 2) * 3
,1 + 2
首先会评估,然后将该表达式的结果替换回外部表达式,以进行其余的评估。
在您的示例中,逗号在两种情况下使用:
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
产生3var bbb = (1, 2, 3);
(1, 2, 3)
产生3
如上所述bbb
被赋值3
aaa = 1, 2, 3
=>逗号运算符用于分离以下3个语句:aaa=1
,2
和3
。逗号运算符的结果是最后一条语句3的值。但是,从OP的屏幕截图中可以清楚地看到,aaa被赋值为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);
}
var a1,a2,a3;
将只声明三个局部变量。