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

IT技术 javascript parsing logic
2021-03-06 04:16:32

我偶然发现了一些 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 语法吗?它有什么实际用途吗?

5个回答

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

您能否更具体地说明“赋值或函数调用”?你是什​​么意思?一般来说,一切都可以在没有逗号运算符的情况下编写。
2021-04-25 04:16:32
一些程序员希望通过编写尽可能少的代码行来编写函数。虽然这可能是一个有趣的挑战,但我认为他们经常陷入不必要的复杂性,使他们的代码难以理解/维护。
2021-05-02 04:16:32
对我来说,为什么首先允许这样做没有多大意义,如果我要重写问题中上面写的 if 语句,我会简单地放在console.log('super')if 子句的正上方。
2021-05-02 04:16:32
感谢您用消息来源实际回答这个问题……可惜我不得不滚动浏览一堆其他评分较高的答案才能找到它
2021-04-21 04:16:32
MDN 文档必须已更新,因为它现在说“逗号运算符评估其每个操作数(从左到右)并返回最后一个操作数的值。”
2021-05-16 04:16:32

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

while(doSomething(), checkIfSomethingHappened());

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

var foo = 1,
    bar = 2;
@Bergi ... do/while 循环只是愚蠢的,因为您在看到条件之前看到了语句。我实际上非常喜欢 Matt 示例中使用的逗号运算符。巧妙。我敢打赌,当我下次使用它时,我会挑起眉毛。
2021-04-25 04:16:32
while 语句中的绝妙例子爱它。它可能相当于for(;doSomething(),checkIfSomethingHappened(););
2021-04-25 04:16:32
@RobertKoritnik 好吧,您看到条件之前的语句是因为它们是在条件之前执行的吗?逗号运算符也没有什么不同......
2021-04-29 04:16:32
我明白为什么它可以用在循环语句中。但是,OP 问题是关于if陈述的。
2021-05-02 04:16:32
这就是do Something(); while (hasSomethingHappened())循环的目的……
2021-05-15 04:16:32

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

int x,y;
for(x = 0, y = 0; x < 10 || y < 100; x++, y++) {
....
}
虽然在 for 语句中它的工作方式不同,因为第一个表达式只计算一次,而第二个和第三个在每次迭代中。在 if/while 语句中,每次访问语句时都会评估所有表达式。
2021-05-06 04:16:32
我明白为什么它可以用在循环语句中。但是,OP 问题是关于if陈述的。
2021-05-09 04:16:32

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

例子:

if(a = 2, a > 1) console.log('a is', a)