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

IT技术 javascript comma-operator
2021-01-19 02:14:18

我看了这个关于表达式(以下简称“逗号操作”的问题,)和MDN文档有关,但我想不出一个场景的地方是有用的。

那么,逗号运算符什么时候有用呢?

6个回答

以下内容可能不是很有用,因为您不是自己编写的,但是缩小器可以使用逗号运算符缩小代码。例如:

if(x){foo();return bar()}else{return 1}

会成为:

return x?(foo(),bar()):1

? :操作者现在可以使用,因为逗号运算符(在一定程度上)允许两个语句被写为一个语句。

有用的,因为它允许一些整齐压缩(39 -这里> 24字节)。


我想强调的是,在逗号var a, b不是逗号运算符,因为它没有一个中存在的表达逗号在var 语句中具有特殊含义a, b在表达式中将引用这两个变量并计算为b,而 的情况并非如此var a, b

我认为在您的代码中有用的类似用法是在内联 if 语句中分配多个变量。例如:if (condition) var1 = val1, var2 = val2;我个人认为尽可能避免使用括号使代码更具可读性。
2021-03-14 02:14:18
我使用逗号运算符的唯一时间是在向表达式 (foo => (console.log('foo', foo), foo)) 添加日志语句时,或者如果我对 reduce iteratees 过于聪明. (pairs.reduce((acc, [k, v]) => (acc[k] = v, acc), {}))
2021-03-16 02:14:18
几天我只是在用Closure Compiler来看看它到底做了什么,我确实注意到了这种替换。
2021-03-19 02:14:18
你是怎么考虑的?你在什么地方读过吗?真的被利用了吗?
2021-04-02 02:14:18

在 Javascript 中编写函数式代码时,逗号运算符通常很有用。

考虑一下我前段时间为 SPA 编写的这段代码,它有如下内容

const actions = _.chain(options)
                 .pairs() // 1
                 .filter(selectActions) // 2
                 .map(createActionPromise) // 3
                 .reduce((state, pair) => (state[pair[0]] = pair[1], state), {}) // 4
                 .value();

这是一个相当复杂但真实的场景。在我解释正在发生的事情时请耐心等待,并在此过程中为逗号运算符提供案例。


这使用Underscore的链接到

  1. 将传递给此函数的所有选项拆开,使用pairs which 将{ a: 1, b: 2}变成[['a', 1], ['b', 2]]

  2. 该属性对数组通过哪些属性对被视为系统中的“动作”进行过滤。

  3. 然后将数组中的第二个索引替换为一个函数,该函数返回一个表示该操作的Promise(使用map

  4. 最后,对 的调用reduce会将每个“属性数组” ( ['a', 1])合并回最终对象。

最终结果是options参数的转换版本,它只包含适当的键,其值可由调用函数使用。


看着只是

.reduce((state, pair) => (state[pair[0]] = pair[1], state), {})

可以看到reduce函数从一个空的状态对象开始state,对于每一对代表一个键值对,该函数在state给键值对对应的对象添加一个属性后返回同一个对象。由于 ECMAScript 2015 的箭头函数语法,函数体是一个表达式,因此,逗号运算符允许一个简洁而有用的“迭代”函数。

就我个人而言,在使用 ECMAScript 2015 + Arrow Functions 以更具功能性的风格编写 Javascript 时,我遇到了许多情况。话虽如此,在遇到箭头函数之前(例如在编写问题时),我从未以任何故意的方式使用逗号运算符。

尼斯的答案,但如果我可以建议一些稍微更具可读性:.reduce((state, [key, value]) => (state[key] = value, state), {})我意识到这违背了答案的目的,但.reduce((state, [key, value]) => Object.assign(state, { [key]: value }), {})会完全消除对逗号运算符的需要。
2021-03-17 02:14:18
虽然现在 Object.assign 可能更惯用了,甚至只是扩展运算符,但我不确定它们当时是否被广泛使用。我还要指出,虽然逗号运算符有点模糊,但在数据集非常大的情况下,这可能会产生更少的垃圾。不过,解构肯定会有助于提高可读性!
2021-03-27 02:14:18
这是关于程序员如何/何时使用逗号运算符的唯一真正有用的答案。非常有用,尤其是在reduce
2021-04-07 02:14:18

逗号运算符允许您将多个表达式放在需要一个表达式的位置。 由逗号分隔的多个表达式的结果值将是最后一个逗号分隔表达式的值。

我个人并不经常使用它,因为在很多情况下需要多个表达式的情况并不多,并且没有比使用逗号运算符更容易编写代码的方法了。一种有趣的可能性是在for循环结束时,您希望增加多个变量:

// j is initialized to some other value
// as the for loop executes both i and j are incremented
// because the comma operator allows two statements to be put in place of one
for (var i = 0; i < items.len; i++, j++) {
    // loop code here that operates on items[i] 
    // and sometimes uses j to access a different array
}

在这里你看到i++, j++可以放在一个允许一个表达式的地方。在这种特殊情况下,多个表达式用于副作用,因此复合表达式采用最后一个的值无关紧要,但在其他情况下这可能实际上很重要。

逗号运算符的另一个用途是在 repl 或控制台中隐藏您不关心的结果,纯粹是为了方便。

例如,如果您myVariable = aWholeLotOfText在 repl 或控制台中进行评估,它将打印您刚刚分配的所有数据。这可能是一页又一页,如果您不想看到它,您可以改为评估myVariable = aWholeLotOfText, 'done',并且 repl/控制台将只打印“完成”。

Oriel 正确地指出定制toString()get()功能甚至可能使其有用。

@Oriol - 不错!你完全正确。不知何故,这种可能有用的感觉有点令人失望:)
2021-03-16 02:14:18
哈,好主意!(最后一个真正回答问题的答案与几乎所有答案不同{和 3 个删除的答案,您需要 20K 声望才能看到...})
2021-04-04 02:14:18
如果分配的值是一个对象,控制台可能会尝试很好地显示它。为此,它可能例如调用 getter,这可能会更改对象的状态。使用逗号可以防止这种情况。
2021-04-07 02:14:18

逗号运算符并非特定于 JavaScript,它可用于其他语言,如C 和 C++作为二元运算符,当第一个操作数(通常是表达式)具有第二个操作数所需的副作用时,这很有用。维基百科的一个例子:

i = a += 2, a + b;

显然,您可以编写两行不同的代码,但使用逗号是另一种选择,有时更具可读性。

顺便说一句,我不考虑在变量声明中使用逗号或在循环中初始化多个变量。在这些情况下,逗号通常更好。
2021-03-26 02:14:18
将此视为另一种选择,尽管善的定义可能因人而异。但是,我找不到任何必须使用逗号的示例。另一个类似的东西是三元 ?: 运算符。这总是可以用 if-else 代替,但有时 ?: 比 if-else 使代码更具可读性。同样的概念也适用于逗号。
2021-03-29 02:14:18
这看起来令人困惑……wtf。
2021-04-06 02:14:18