逗号是否在Javascript if语句中在语法上有效?

Ale*_*lex 19 javascript syntax

最近几天,我一直在帮朋友学习Javascript.这是他多年来的第一语言,他几乎没有记得,所以他几乎从头开始.他一直在做一个简单的教程,我一直在为他提供一些练习来帮助他练习.我给他的最近一次练习是(显然)经典的FizzBu​​zz问题.他通过一些帮助解决了这个问题,但在制定解决方案时他做了一些非常有趣的事情.他想出了以下代码:

for (var x = 1; x <= 100; x++) {
    if (x%3 == 0, x%5 != 0) {
        console.log("Fizz");
    }
    else if (x%3 != 0, x%5 == 0) {
        console.log("Buzz");
    }
    else if (x%3 == 0, x%5 == 0) {
        console.log("FizzBuzz");
    }
    else {
        console.log(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

他不熟悉布尔比较运算符,因此他没有使用&&而是使用逗号.我的期望是它会崩溃并说一些关于语法错误的信息,但令我惊讶的是它最终运行良好并打印出一堆"Fizz"和"Buzz"行,没有"FizzBu​​zz"或数字.不用说,我很困惑,所以我做了一些实验.我的第一个测试是运行这个:

if (true, true) console.log('true, true');
if (true, false) console.log('true, false');
if (false, true) console.log('false, true');
if (false, false) console.log('false, false');
Run Code Online (Sandbox Code Playgroud)

这给了我两行输出:

'true, true'
'false, true'
Run Code Online (Sandbox Code Playgroud)

从那以后,我猜测所有逗号都是因为它只评估列表中的最后一个表达式.然后我尝试运行此代码:

for (var i = 0; i < 16; i++) {
    if ((Math.floor(i / 8) == 1), (Math.floor(i / 4) == 1), (Math.floor(i / 2) == 1), (i % 2 == 1)) {
        console.log(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是1-15的所有奇数,这证实了我的第一次测试的猜测(因为逗号分隔列表中的最后一个布尔值是每隔一次迭代翻转).

在所有冗长的背景之后,我的问题是:这个逗号语法是Javascript引擎的一个已知且有意的部分,还是一个奇怪的,被忽视的解释器的怪癖?我知道逗号可以用于其他一些事情(在一行中初始化多个变量,声明数组,并将参数分开跳到脑海中),但是我从来没有听说过它们在任何语言的条件语句中被使用,并且我很好奇是否有其他人知道这个代码是否应该运行.

作为参考,我运行的FizzBu​​zz代码和第二个测试都是使用node完成的,我运行的第一个测试是在Chrome的Javascript控制台中完成的,因此它似乎不仅仅是浏览器或节点独有的怪癖如果它确实是一个.另外,如果你真的读到这里,谢谢你.

Rob*_*vey 27

逗号是实际的运算符.它评估它的两个操作数(从左到右)并返回第二个操作数的值.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

它最常见的用法是在for循环中提供多个参数,但它也可以用于其他目的.

  • 呵呵.显然我不习惯谷歌搜索.我试图将其视为运营商并完全失败.感谢您的快速答复. (2认同)