"||=" 运算符与 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
var apple, walrus;
apple = 0;
walrus = 9;
if (apple == null) apple = walrus;
apple || (apple = walrus);
如您所见,?=
明确检查的是 JS 中的 null
或 undefined
。这与 ||=
非常不同,后者仅依赖于 apple
是否为假值。
再扩展一点apple ||= walrus
与apple = apple || walrus
的含义是等价的,所以任何真实的apple值都会短路逻辑而不改变apple的值。
【讨论】:
最后一行让我明白了。谢谢。 (对于普通读者:undefined == null
在 JavaScript 中为 true。undefined
和 null
,两个 false-y 值,是 @987654333 的 only 值@ 导致 x == null
为真。)
@loganfsmyth 它本来可以做得更糟...它具有一流的函数和闭包(有些语言距离这里很长);-)
@pst 哦,当然。我非常喜欢 JS,但它仍然有它的怪癖。
请注意,apple ?= walrus
也可以用作表达式 x = apple ?= walrus
(CoffeeScript 中的一切都是表达式),在这种情况下将编译为 x = apple != null ? apple : apple = walrus;
。【参考方案2】:
?=
是 存在 运算符。它会检查 null
和 undefined
。
||=
只是检查变量的值是否为“非假”,如果我没记错的话……这意味着 0
是假的。
【讨论】:
以上是关于"||=" 运算符与 CoffeeScript 中的 "?=" 有何不同?的主要内容,如果未能解决你的问题,请参考以下文章
"||=" 运算符与 CoffeeScript 中的 "?=" 有何不同?