为什么javascript在if语句中接受逗号?


70

我偶然发现了一些JavaScript语法,似乎它应该产生某种解析错误,但不会:

if (true, true) {console.log('splendid')} else {console.log('horrid')} // splendid
if (true, false) {console.log('splendid')} else {console.log('horrid')} // horrid

尽管所有表达式都已执行,但似乎只有最后一个表达式会影响逻辑:

if  (console.log('super'), true) {console.log('splendid')} // super splendid

有人知道为什么这是有效的JavaScript语法吗?有实际用途吗?


4
简单的答案是“因为C做了”。
Ira Baxter

Answers:


69

逗号运算符将多个表达式链接在一起,并且运算的结果是最后一个操作数的值。它的唯一真正用途是当您需要发生多种副作用(例如赋值或函数调用)时。


2
您能否更具体地谈谈“赋值或函数调用”?你什么意思?通常,所有内容也可以不使用逗号运算符编写。
Bergi 2014年

12
一些程序员希望通过编写尽可能少的代码行来编写函数。尽管这可能是一个有趣的挑战,但我认为它们常常陷入不必要的复杂性,从而使其代码难以理解/维护。
The_Black_Smurf

42

4
感谢您实际回答问题的来源。.很遗憾,我不得不滚动浏览其他一些更高评分的答案才能找到答案
Mishax 2015年

MDN文档必须已更新,因为它现在显示为“逗号运算符评估其每个操作数(从左到右)并返回LAST操作数的值。”
罗伯托

17

javascript中的逗号实际上非常神秘。我见过的最酷的用法是

while(doSomething(), checkIfSomethingHappened());

最常见的是var在现代js中的使用方式

var foo = 1,
    bar = 2;

6
那就是do Something(); while (hasSomethingHappened())循环的
源头

1
我知道为什么可以在循环语句中使用它。但是,OP的问题与if声明有关。
The_Black_Smurf

@Bergi ... do / while循环只是愚蠢的,因为您在看到条件之前先看到语句。我实际上很喜欢Matt的示例中使用的逗号运算符。巧妙。我敢打赌,下次我再使用它时,我会引起一些注意。
罗伯特·科里特尼克'17

while语句中的出色示例。爱它。它可能等效于for(;doSomething(),checkIfSomethingHappened(););
罗伯特·科里特尼克

@RobertKoritnik那么,您会在条件之前看到语句,因为它们是在条件之前执行的?同样,逗号运算符也没有什么不同
Bergi '17

8

这也与大多数其他编程语言相同,在大多数其他编程语言中,循环中可能有多个迭代器。

int x,y;
for(x = 0, y = 0; x < 10 || y < 100; x++, y++) {
....
}

3
我知道为什么可以在循环语句中使用它。但是,OP的问题与if声明有关。
The_Black_Smurf

尽管在for语句中它的工作方式有所不同,因为第一个表达式仅计算一次,而第二个和第三个表达式在每次迭代中。在if / while语句中,每次访问该语句时都会评估所有表达式。
罗伯特·科里特尼克'17

1

我允许在相同的上下文中进行操作和比较。

例:

if(a = 2, a > 1) console.log('a is', a)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.