在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
它的行为与分号;
分隔的语句列表完全相同,只是返回最后一个语句的值。
是否有某个描述此语法及其语义的引用?它为什么存在,即应该何时使用?
答案 0 :(得分:34)
您正在看到comma operator的效果。
逗号运算符计算它的两个操作数(从左到右)并返回第二个操作数的值。
评估a,b,c,...,n
时的结果值始终是最右边表达式的值,但仍会评估链中所有表达式(从左到右)。
答案 1 :(得分:8)
如前所述,此行为是由,
运算符引起的。因此,(null,'cool',false,NaN,4)
表达式将始终评估为4
。所以我们有
",,," == Array(4)
Array(4)
- 创建分配了4个元素的新数组。在与字符串进行比较时,此数组将转换为字符串,就像使用Array(4).toString()
一样。对于数组toString
,就像在此数组上调用的join(',')
方法一样。因此,对于4个元素的空数组,join将生成字符串",,,"
。
答案 2 :(得分:2)
试试这个alert((null,'cool',false,NaN,4))
,然后就可以看到了。
原因是因为逗号运算符会计算所有语句并返回最后一个语句。
想想这一行:a = 1, b = 2, c = 3;
它将运行每个表达式,所以本质上它会将变量设置为你想要的并返回最后一个值(在本例中为3)