【问题标题】:Why does javascript accept commas in if statements?为什么javascript在if语句中接受逗号?
【发布时间】:2011-07-17 21:46:22
【问题描述】:

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

【问题讨论】:

  • 简单的答案是,“因为 C 做了”。

标签: javascript parsing logic


【解决方案1】:

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

【讨论】:

  • 您能否更具体地了解“赋值或函数调用”?你的意思是?一般来说,任何东西都可以不用逗号运算符来编写。
  • 一些程序员希望通过编写尽可能少的代码行来编写函数。虽然这可能是一个有趣的挑战,但我认为他们经常陷入不必要的复杂性,使他们的代码难以理解/维护。
  • 对我来说没有多大意义,为什么首先允许这样做,如果我要重写上面写在问题中的 if 语句,我会简单地将 console.log('super') 放在上面if 子句。
【解决方案2】:

【讨论】:

  • 感谢您用消息来源实际回答了这个问题。可惜我不得不滚动浏览一堆其他评分较高的答案才能找到它
  • MDN 文档必须已经更新,因为它现在说“逗号运算符评估其每个操作数(从左到右)并返回最后一个操作数的值。”
【解决方案3】:

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

while(doSomething(), checkIfSomethingHappened());

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

var foo = 1,
    bar = 2;

【讨论】:

  • 这就是 do Something(); while (hasSomethingHappened()) 循环的用途……
  • 我明白为什么可以在循环语句中使用它。但是,OP 的问题是关于 if 语句的。
  • @Bergi ... do/while 循环只是愚蠢的,因为您在看到条件之前先看到语句。实际上,我非常喜欢在 Matt 的示例中使用的逗号运算符。巧妙。我敢打赌,当我下次使用它时,我一定会扬眉吐气。
  • 精彩示例 in while 语句。爱它。它可能相当于for(;doSomething(),checkIfSomethingHappened(););
  • @RobertKoritnik 好吧,您看到条件之前的语句是因为它们是在条件之前执行的吗?逗号运算符也没有什么不同......
【解决方案4】:

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

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

【讨论】:

  • 我明白为什么可以在循环语句中使用它。但是,OP 的问题是关于 if 语句的。
  • 虽然在 for 语句中它的工作方式不同,因为第一个表达式只计算一次,而第二个和第三个表达式在每次迭代中。在 if/while 语句中,每次访问语句时都会评估所有表达式。
【解决方案5】:

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

例子:

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

【讨论】:

    猜你喜欢
    • 2014-09-09
    • 2010-10-16
    • 2019-09-29
    • 2019-02-13
    • 2013-09-08
    • 2014-02-27
    • 1970-01-01
    • 2012-05-11
    • 2020-04-11
    相关资源
    最近更新 更多