逗号运算符什么时候有用?
以下内容可能不是很有用,因为您不是自己编写的,但是缩小器可以使用逗号运算符缩小代码。例如:
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
。
在 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的链接到
将传递给此函数的所有选项拆开,使用
pairs
which 将{ a: 1, b: 2}
变成[['a', 1], ['b', 2]]
该属性对数组通过哪些属性对被视为系统中的“动作”进行过滤。
然后将数组中的第二个索引替换为一个函数,该函数返回一个表示该操作的Promise(使用
map
)最后,对 的调用
reduce
会将每个“属性数组” (['a', 1]
)合并回最终对象。
最终结果是options
参数的转换版本,它只包含适当的键,其值可由调用函数使用。
看着只是
.reduce((state, pair) => (state[pair[0]] = pair[1], state), {})
可以看到reduce函数从一个空的状态对象开始state
,对于每一对代表一个键值对,该函数在state
给键值对对应的对象添加一个属性后返回同一个对象。由于 ECMAScript 2015 的箭头函数语法,函数体是一个表达式,因此,逗号运算符允许一个简洁而有用的“迭代”函数。
就我个人而言,在使用 ECMAScript 2015 + Arrow Functions 以更具功能性的风格编写 Javascript 时,我遇到了许多情况。话虽如此,在遇到箭头函数之前(例如在编写问题时),我从未以任何故意的方式使用逗号运算符。
逗号运算符允许您将多个表达式放在需要一个表达式的位置。 由逗号分隔的多个表达式的结果值将是最后一个逗号分隔表达式的值。
我个人并不经常使用它,因为在很多情况下需要多个表达式的情况并不多,并且没有比使用逗号运算符更容易编写代码的方法了。一种有趣的可能性是在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()
功能甚至可能使其有用。
逗号运算符并非特定于 JavaScript,它可用于其他语言,如C 和 C++。作为二元运算符,当第一个操作数(通常是表达式)具有第二个操作数所需的副作用时,这很有用。维基百科的一个例子:
i = a += 2, a + b;
显然,您可以编写两行不同的代码,但使用逗号是另一种选择,有时更具可读性。