Javascript 不熟悉的带括号和逗号的变量赋值

Javascript 不熟悉的带括号和逗号的变量赋值,javascript,Javascript,为什么像这样用括号赋值只计算最后一个值 var a = (1, 2, 5 - 1); //4 它似乎也需要括号 var a = 1, 5 - 1; //SyntaxError: Unexpected number ,符号在JavaScript语法中有几个相似但明显不同的角色。在var声明中,逗号分隔变量声明子句。但是,在表达式中,逗号“运算符”提供了一种将多个表达式填充在一起的方法,其形式在语法上等同于单个表达式。这在某些罕见的情况下有些有用 因此,括号在这里起作用,因为没有括号,解析器希

为什么像这样用括号赋值只计算最后一个值

 var a = (1, 2, 5 - 1); //4
它似乎也需要括号

var a = 1, 5 - 1; //SyntaxError: Unexpected number

符号在JavaScript语法中有几个相似但明显不同的角色。在
var
声明中,逗号分隔变量声明子句。但是,在表达式中,逗号“运算符”提供了一种将多个表达式填充在一起的方法,其形式在语法上等同于单个表达式。这在某些罕见的情况下有些有用

因此,括号在这里起作用,因为没有括号,解析器希望每个逗号分隔的子句都是变量声明和(可选)初始化。使用括号,初始化的右侧在语法上是一个表达式,即使它是由逗号运算符连接的三个独立的不相关表达式

表达式中的逗号运算符在涉及允许使用单个表达式的语法的情况下很有用,但您确实希望使用多个表达式。最好的例子是
for
循环头中的第三个子句。如果您需要增加两个独立的变量,那么在循环头中这样做(可能)会更清楚;但是,只有一个表达式的规定。因此,逗号运算符允许您作弊:

for (var a = 0, b = 1; a < limit; a++, b = something(b)) {
  // ...
}
for(变量a=0,b=1;a

请注意,
标题的
第一个子句中的逗号不是逗号运算符;分隔变量声明子句的是逗号。(我想有些人可能仍然使用术语“逗号运算符”,但我的观点是,它并没有分隔表达式列表。)

当添加括号时,则
=
符号右侧的表达式是逗号运算符序列。用逗号分隔的表达式列表的值是列表中最后一个表达式的值。@Pointy如果你不使用答案框,我不能给你任何神奇的独角兽点数@如果只需要最后一个,为什么要用它呢?@scimonester对不起,我在找一个复制品;好像就在几天前,我偶然发现了一个与这个问题几乎相同的问题。。。但是我找不到。你能提供一些“罕见病例”的例子吗?Thanks@thomas
for
循环就是一个例子。看看这本书。