逗号在JavaScript表达式中做了什么?

时间:2010-08-24 21:08:01

标签: javascript comma-operator

如果我使用:

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 个答案:

答案 0 :(得分:79)

  

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

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

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

答案 1 :(得分:5)

需要考虑更多警报:

alert((0, 9));
alert((9, 0));
alert(("foo", "bar"));

另外,如果您想以交互方式尝试,请查看Firebug console

答案 2 :(得分:4)

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

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

这将声明所有三个变量而不写:

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

希望有所帮助。

答案 3 :(得分:2)

  <德尔>   逗号运算符评估两者   它的操作数(从左到右)和   返回second的值   操作数。   

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

应该是这样的!

  

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

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

答案 4 :(得分: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属性中的数组中的输入值本身。

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

((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)

答案 5 :(得分:0)

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

(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.