逗号在 JavaScript 表达式中的作用是什么?

IT技术 javascript comma-operator
2021-01-23 20:29:34

如果我使用:

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
6个回答

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

来源: 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));

他们从 C 那里拿来的。我认为它只对有副作用的表达式有用。
2021-03-10 20:29:34
@ user17753 你很有钱;试图理解一小段缩小的代码就是我在这里的原因
2021-03-27 20:29:34
@Cyoce:虽然这是真的,但一般来说,在循环体中更清楚地执行了这种逻辑。然后有些人会声称他们的方式允许多continue点而不重复,但是你不应该有多个continue点。
2021-03-28 20:29:34
我想不出很多情况下逗号运算符用于任何影响但保存字符(缩小)或混淆代码。
2021-04-06 20:29:34
@user17753 它可以在for循环的分号分隔部分中合法使用
2021-04-06 20:29:34

还有一些需要考虑:

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

@Andrew:oop,我已经用我打算使用的内容更新了我的答案。
2021-03-18 20:29:34
逗号运算符计算其每个操作数(从左到右)并返回last操作数的值
2021-03-23 20:29:34
逗号运算符计算它的两个操作数(从左到右)并返回second 操作数的值

https://stackoverflow.com/a/3561056/5934465

应该是这样的!

逗号运算符计算其每个操作数(从左到右)并返回last操作数的值

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

逗号运算符采用两个操作数,因此原始引用是正确的。您所谈论的是嵌套此类表达式的最终结果,但这意味着您的替换引号被巧妙地误用了。a,b,c,d((((a),b),c),d)
2021-04-01 20:29:34

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

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属性中的数组中

它仍然是语法糖(如箭头函数),但它确实缩短了行数......我想知道一些 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 好吧,我会说这取决于目的(例如教学、缩短代码、没有变量/函数声明等)。如果你像我上面那样缩进它,它是完全可读的......不能停止注意到你使用了“神秘”这个词:)
2021-03-10 20:29:34
呵呵,这也不是故意的😂
2021-04-05 20:29:34
但是,您当然不会将这种神秘的咒语放入生产代码中,对吗?
2021-04-06 20:29:34

特定的语法允许您在功能上烤面包并将其交给客户消费,而无需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.