什么时候使用逗号运算符有用?

115

我读了有关表达式中“逗号运算符”(,)和MDN文档这个问题,但我无法想到什么场景它是有用的。

那么,在什么情况下逗号运算符是有用的呢?


2
var i, j, k;var i; var j, var k 有什么区别? - Salman A
21
我不确定这与,运算符有任何关系。那行代码在C#中也是有效的,但是在C#中不存在,运算符。 - gdoron
2
@SalmanA。我找了,没有找到,请指教... - gdoron
6
在C#中,逗号(,)不总是逗号操作符,而且它从不是逗号操作符。因此,即使没有逗号操作符,C#仍然可以自由地使用逗号作为语法的一部分。请注意,这里不需要写解释。 - Seth Carnegie
9
这里的回答已经总结了“,”并不常用(而且并非每个“,”都是逗号运算符)的事实。但你可以借助它和数组来进行内联变量交换而不创建临时变量。假设你想要交换 ab 的值,你可以这样写:a = [b][b = a,0]。这会把当前的 b 放到数组中。第二个“[]”是属性访问符号。被访问的索引是 0,但是在将 a 分配给 b 之前,这不会发生,因为现在 b 被保留在数组中。逗号运算符让我们在“[]”中执行多个表达式。 - user1106925
显示剩余6条评论
15个回答

2

我通常在可选参数解析时使用它。我认为这使得函数体更易读和更简洁,因此参数解析不会占据函数主体。

/**
 * @param {string} [str]
 * @param {object} [obj]
 * @param {Date} [date]
 */
function f(str, obj, date) {
  // handle optional arguments
  if (typeof str !== "string") date = obj, obj = str, str = "default";
  if (obj instanceof Date) date = obj, obj = {};
  if (!(date instanceof Date)) date = new Date();

  // ...
}

1
尽管我个人不太喜欢它,但这是唯一一个例子,我认为人们可以说它比等效的单独表达式语句列表更易读,而不让我觉得他们完全疯了。 - Semicolon

2

Let's say you have an array:

arr = [];

当你向数组中push元素时,你很少关心push的返回值——即数组的新长度,而是更关心数组本身。这时候你需要使用原始回答
arr.push('foo')  // ['foo'] seems more interesting than 1

使用逗号运算符,我们可以将元素推入数组,将数组作为最后的操作数传递给逗号运算符,并使用结果——数组本身——来进行随后的数组方法调用,类似于链式调用:

使用逗号运算符,我们可以在不占用变量的情况下向数组中添加元素,并且可以通过将数组作为最后一个操作数传递给逗号运算符来实现链式调用。
(arr.push('bar'), arr.push('baz'), arr).sort(); // [ 'bar', 'baz', 'foo' ]

1

逗号运算符(,)按从左到右的顺序评估其每个操作数并返回最后一个操作数的值。这使您可以创建一个复合表达式,其中多个表达式被评估,复合表达式的最终值是其成员表达式中最右边的值。这通常用于为for循环提供多个参数。

let x = 1;

x = (x ++,x);

console.log(x); // 预期输出:2

x = (2, 3);

console.log(x); // 预期输出:3

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


1

它可以避免您在嵌套条件语句中使用return,尤其是在三元运算符中非常方便。例如:

function insert(v){
  return this.node > v ? this.left.size < this.right.size ? ( this.left.insert(v)
                                                            , this
                                                            )
                                                          : ( this.left.insert(this.node)
                                                            , this.node = this.right.popmin()
                                                            , this.insert(v)
                                                            , this
                                                            )
                       : this.left.size < this.right.size ? ( this.right.insert(this.node)
                                                            , this.node = this.left.popmax()
                                                            , this.insert(v)
                                                            , this
                                                            )
                                                          : ( this.right.insert(v)
                                                            , this
                                                            )
}

这个答案如果能解释一下它在做什么,以及与不使用逗号运算符的类似代码相比如何,可能会更有用。而且那个缩进太讨厌了! - miken32

-3

逗号运算符可以用于代码混淆的另一个领域。

假设一个开发者编写了以下代码:

var foo = 'bar';

现在,她决定混淆代码。使用的工具可能会将代码更改为以下内容:

var Z0b=(45,87)>(195,3)?'bar':(54,65)>(1,0)?'':'baz';// Z0b == 'bar'

演示:http://jsfiddle.net/uvDuE/


1
@gdoron 请查看这个回答 https://dev59.com/hGMm5IYBdhLWcg3wDrtR#17903036 关于C++中的逗号运算符。您会注意到James Kanze关于混淆的评论。 - Stephan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接