【问题标题】:What does the comma operator do in JavaScript?逗号运算符在 JavaScript 中有什么作用?
【发布时间】:2022-11-25 09:37:19
【问题描述】:

如果我使用:

1.09 * 1; // returns "1.09"

但是如果我使用:

1,09 * 1; // returns "9"

我知道 1,09 不是数字。

最后一段代码中逗号的作用是什么?

更多例子

if (0,9) alert("ok"); // alert
if (9,0) alert("ok"); // don't alert

alert(1); alert(2); alert(3); // 3 alerts
alert(1), alert(2), alert(3); // 3 alerts too

alert("2",
    foo = function (param) {
        alert(param)
    },
    foo('1')
)
foo('3'); // alerts 1, 2 and 3

【问题讨论】:

  • 我很惊讶 09 没有因为八进制文字中的非法“9”而失败。
  • @recursive - 八进制表示中的任何 9 都会退回到十进制。
  • 不要混淆参数列表中的逗号。 alert 只接受一个参数。之后的任何东西都被丢弃。
  • @Andrew:是的,被 alert() 丢弃,它只接受一个参数,但它会被运行!这很奇怪。谢谢。
  • @Topera:如果您从 JS 的角度考虑它,那并不是很奇怪。在 JS 中,您不必在函数声明中指定参数列表(您可以改用 arguments 对象,它可以是任意长度)。即使使用现代编译的 JS,也没有办法提前告诉函数需要多少个参数。考虑一下:function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ; 解释器必须知道该函数是如何被使用的,才能知道它需要多少参数。相反,它评估一切。

标签: javascript comma-operator


【解决方案1】:

逗号运算符评估两者 它的操作数(从左到右)和 返回第二个的值 操作数。

资源:https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

例如,表达式 1,2,3,4,5 的计算结果为 5。显然,逗号运算符仅对有副作用的操作有用。

console.log(1,2,3,4,5);
console.log((1,2,3,4,5));

【讨论】:

  • 我想不出很多情况下,逗号运算符用于任何影响但保存字符(缩小)或混淆代码。
  • @user17753 它可以在 for 循环的分号分隔部分中合法使用。
  • @Cyoce:虽然这是真的,但一般来说,这种逻辑在循环体中执行得更清楚。然后有些人会声称他们的方式允许多个continue点而不会重复,但是你不应该有多个continue点。
  • @user17753 你赚到了;试图理解一小段缩小代码是我来这里的原因
  • Vue 文档在他们的template compilation example 上使用它
【解决方案2】:

还有一些需要考虑的:

console.log((0, 9));
console.log((9, 0));
console.log(("foo", "bar"));

【讨论】:

    【解决方案3】:

    特定的语法允许您功能性地烘烤面包并将其交给客户食用,无需returns。

    (new Array(3)).fill()
    .map(()=>({state:"dough", bake(){this.state="baked"}, consume(){this.state="consumed"}}))
    
    .map(bread=>(console.log(`Adding ${bread.state} to oven.`), bread.bake(), bread))
    .map(bread=>(console.log(`Consuming ${bread.state} bread.`), bread.consume(), bread))
    .map(bread=>console.log(`Bread is now ${bread.state}.`))
    
    Adding dough to oven.
    Adding dough to oven.
    Adding dough to oven.
    Consuming baked bread.
    Consuming baked bread.
    Consuming baked bread.
    Bread is now consumed.
    Bread is now consumed.
    Bread is now consumed.
    

    【讨论】:

      【解决方案4】:

      添加/修改对象的属性和在同一行返回它是一个可能的用例:

      console.log(
        ((x) => (o = {biggerCond: r => r >= x},
                 o.r5 = Array.from(window.crypto.getRandomValues(new Uint16Array(5))),
                 o.isAnyBigger = o.r5.some(o.biggerCond),
                 o.bigger = o.isAnyBigger ? o.r5.filter(o.biggerCond) : [x], o )
        )(5e4)
      );
      // Example
      // {
      //   bigger: [58414, 56500, 63397],
      //   isAnyBigger: true,
      //   isBiggerCond: r => r >= x,
      //   r5: [58414, 12015, 56500, 63397, 43861]
      // }

      上面的匿名函数返回一个对象,其随机值大于输入值,或者如果没有,则输入值本身位于 bigger 属性中包含的数组中。

      它仍然是语法糖(如arrow functions),但它确实缩短了行数……我想知道是否某些 JS 压缩器会自动以类似的方式检测和调整代码。在您的控制台中运行它:

      ((x)=>(o={biggerCond:r=>r>=x},o.r5=Array.from(window.crypto.getRandomValues(new Uint16Array(5))),o.isAnyBigger=o.r5.some(o.biggerCond),o.bigger=o.isAnyBigger?o.r5.filter(o.biggerCond):[x],o))(5e4)
      

      【讨论】:

      • 但是,您当然不会将这种神秘的咒语放入生产代码中,对吗?
      • @LightnessRacesinOrbit 好吧,我会说这取决于目的(例如教学、缩短代码、无变量/函数声明等)。如果你像我上面那样缩进它,它是完全可读的......不能停止注意到你使用了“神秘”这个词:)
      • 呵呵,不是故意的?
      【解决方案5】:

      看看here - 逗号代表多个表达式/语句。例如,在您的代码中,您可以使用如下一行:

      var a=0, b=0, c=0;
      

      这将在不编写的情况下声明所有三个变量:

      var a=0;
      var b=0;
      var c=0;
      

      希望有所帮助。

      【讨论】:

      • 它有点旧,但需要注意:(1)您提供的示例不使用逗号运算符(var声明不使用逗号操作员, 即使它是逗号) 和 (2) 您不能使用逗号运算符分隔语句;只允许表达。
      猜你喜欢
      • 2022-06-09
      • 2010-09-14
      • 2010-09-08
      相关资源
      最近更新 更多