"||=" 运算符与 CoffeeScript 中的 "?=" 有何不同?

Posted

技术标签:

【中文标题】"||=" 运算符与 CoffeeScript 中的 "?=" 有何不同?【英文标题】:How does the "||=" operator differ from "?=" in CoffeeScript? 【发布时间】:2012-05-14 22:42:32 【问题描述】:

这两者有什么区别?从 Ruby 开始,我习惯于 apple ||= walrus 仅当 apple 为 null 时才将 apple 设置为等于 walrus。这在 JS/CS 中似乎是一样的,尽管 ?= 似乎做同样的事情。让我困惑的是:

apple = 0
walrus = 9
apple ?= walrus // outputs 0
apple ||= walrus // outputs 9

【问题讨论】:

【参考方案1】:

最好的办法是查看生成的 JS。

咖啡脚本:

apple = 0
walrus = 9
apple ?= walrus // outputs 0
apple ||= walrus // outputs 9

javascript

var apple, walrus;
apple = 0;
walrus = 9;
if (apple == null) apple = walrus;
apple || (apple = walrus);

如您所见,?= 明确检查的是 JS 中的 nullundefined。这与 ||= 非常不同,后者仅依赖于 apple 是否为假值。

再扩展一点apple ||= walrusapple = apple || walrus的含义是等价的,所以任何真实的apple值都会短路逻辑而不改变apple的值。

【讨论】:

最后一行让我明白了。谢谢。 (对于普通读者:undefined == null 在 JavaScript 中为 true。undefinednull,两个 false-y 值,是 @987654333 的 only 值@ 导致 x == null 为真。) @loganfsmyth 它本来可以做得更糟...它具有一流的函数和闭包(有些语言距离这里很长);-) @pst 哦,当然。我非常喜欢 JS,但它仍然有它的怪癖。 请注意,apple ?= walrus 也可以用作表达式 x = apple ?= walrus(CoffeeScript 中的一切都是表达式),在这种情况下将编译为 x = apple != null ? apple : apple = walrus;【参考方案2】:

?=存在 运算符。它会检查 nullundefined

||= 只是检查变量的值是否为“非假”,如果我没记错的话……这意味着 0 是假的。

【讨论】:

以上是关于"||=" 运算符与 CoffeeScript 中的 "?=" 有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

"||=" 运算符与 CoffeeScript 中的 "?=" 有何不同?

SQL Server "<>" 运算符与具有几百万行的表上的 "=" 相比非常慢

布尔值与比较运算符"=="

R语言比较运算符和逻辑运算符顺序

python // 与 / * 和 ** 运算符 的含义

java~"与运算"实现保留一个数的低8位