Javascript的“元组”符号表示法:它有什么作用?

29

我在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

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

有没有一个描述这种语法及其语义的参考资料?它为什么存在,即应该在什么情况下使用?


这是逗号运算符:http://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/ - Lepidosteus
1
逗号运算符也可以被(滥)用于在三元条件分支内运行一系列函数,因为它将返回最后一个语句的结果:var a = isTrue ? (b=f(c), g(b)) : (b=g(c), f(b))。虽然不明智,但有时为了简洁的代码而非可读性,或者为了快速调试而有用。 - okdewit
在JavaScript中,这被称为“表达式”,虽然逗号运算符只起到了很小的作用; 此表达式是由于逗号运算符而解析的。您可以将值设置为任何已评估表达式的任何可变变量。即使该表达式未定义。 - Eric Hodonsky
3个回答

37
你正在看到逗号运算符的效果。
逗号运算符从左到右评估它的两个操作数并返回第二个操作数的值。
当评估a,b,c,...,n时,结果值将始终是最右边表达式的值,然而所有链中的表达式仍将被从左到右评估。

谢谢,我要找的术语是“逗号运算符”。 - Grilse

8
正如之前所解释的那样,这种行为是由逗号运算符引起的。因此,表达式`(null,'cool',false,NaN,4)`将始终计算为`4`。因此我们有:
",,," == Array(4)

Array(4) - 创建一个具有4个元素的新数组。在与字符串比较时,该数组将转换为字符串,就像使用 Array(4).toString() 一样。对于数组,toString 的行为类似于在该数组上调用 join(',') 方法。因此,对于由4个元素组成的空数组,join将生成字符串",,,"


2
尝试这个alert((null,'cool',false,NaN,4))然后你就会看到。 示例 原因是逗号运算符评估所有语句并返回最后一个。
想象一下这一行:a = 1, b = 2, c = 3;它将运行每个表达式,实质上将变量设置为您想要的值并返回最后一个值(在本例中为3)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接