为什么/如何解释这个裸数字的“列表”?

时间:2016-12-09 21:28:54

标签: javascript node.js

由于我今天发了一个拼写错误,我开始搞乱我的node repl,并试图弄清楚为什么在Chrome和Node(v6.9.2)中我的机器上都会发生这种情况。

> 1, 2, 3, 8
8
> a = 1, 2, 3, 8
8
> a
1
> (1, 2, 3, 8).toString()
'8'

什么是javascript引擎在这里看到/解析/做什么?我不禁对正在发生的事情感到困惑,并希望了解我可以去哪里了解更多信息。

1 个答案:

答案 0 :(得分:5)

这里的逗号运营商,正在做它的魔力。 expr1, expr2将评估两个表达式,但仅返回后者。

如果expr1没有副作用,那么逗号运算符实际上不是很有用,因为它在功能上与expr2相同:

var a = (2, 3); // 2 and 3 are both evaluated, but final result is 3; no side effects
var b = 3;    // functionally equivalent to the above

它产生影响的地方是expr1有副作用,例如调用函数或更改变量:

var a = 0, b = 3;
var c = (++a, ++b); // ++a has the side effect of incrementing a

var d;
d = 5, 6;     // (d = 5) has the side effect of setting d to 5

// now a = 1, b = 4, c = 4, d = 5

这种情况有用的一种情况是当你有一个带有两个你想要递增的同时变量的for循环时:

for(let i = 0, j = 5; i < 3; i++, j++) {
                          // `------´  comma expression, so both are incremented
  console.log(i, j);
}

// prints:
//   0 5
//   1 6
//   2 7

另请注意,逗号运算符与语句分隔符;不同,因此以下内容不会像expecte一样工作