99

如果我使用:

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
4

6 回答 6

102

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

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

于 2010-08-24T21:09:55.000 回答
6

还有一些需要考虑:

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

于 2010-08-24T22:04:55.610 回答
3
逗号运算符计算其两个操作数(从左到右)并返回second 操作数的值。

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

应该是这样的!

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

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

于 2017-06-15T16:31:36.597 回答
0

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

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)
于 2018-03-21T12:12:34.117 回答
0

特定的语法允许您在功能上烘烤面包并将其交给客户以在没有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.
于 2021-04-21T15:47:14.687 回答
-1

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

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

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

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

希望有帮助。

于 2010-08-24T21:12:49.003 回答