28

wtfjs,我发现以下是合法的 javascript。

",,," == Array((null,'cool',false,NaN,4)); // true

这个参数(null,'cool',false,NaN,4)对我来说看起来像一个元组,但 javascript 没有元组!

我的 javascript 控制台中的一些快速测试会产生以下结果。

var t = (null,'cool',false,NaN,4); // t = 4
(null,'cool',false,NaN,4) === 4; // true
(alert('hello'), 42); // shows the alert and returns 42

它的行为似乎与分号;分隔的语句列表完全一样,只是返回最后一条语句的值。

在某处是否有描述此语法及其语义的参考?它为什么存在,即何时应该使用它?

4

3 回答 3

36

您正在看到逗号运算符的效果。

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

求值时的结果值a,b,c,...,n将始终是最右边表达式的值,但是链中的所有表达式仍会求值(从左到右)。

于 2012-01-26T12:48:51.383 回答
8

如前所述,此行为是由,操作员引起的。因此,表达式(null,'cool',false,NaN,4)将始终计算为4。所以我们有

",,," == Array(4)

Array(4)- 创建分配了 4 个元素的新数组。在与字符串进行比较时,此数组将转换为字符串,就像使用Array(4).toString(). 对于数组toString,其作用类似于join(',')在此数组上调用的方法。所以对于 4 个元素的空数组 join 将产生字符串",,,"

于 2012-01-26T12:57:01.290 回答
2

试试这个alert((null,'cool',false,NaN,4)),然后你就可以看到了。

演示

原因是逗号运算符计算所有语句并返回最后一个。

想想这一行:a = 1, b = 2, c = 3;它将运行每个表达式,因此本质上它将变量设置为您想要的并返回最后一个值(在本例中为 3)

于 2012-01-26T12:48:14.737 回答