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

Chr*_*ris 15 operators assignment-operator coffeescript

这两者有什么区别?从Ruby开始,apple ||= walrus只有当apple为null 时,我习惯将apple设置为等于walrus.这似乎在JS/CS中是相同的,但是?=似乎做同样的事情.令我困惑的是:

apple = 0
walrus = 9
apple ?= walrus // outputs 0
apple ||= walrus // outputs 9
Run Code Online (Sandbox Code Playgroud)

log*_*yth 23

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

CoffeeScript的:

apple = 0
walrus = 9
apple ?= walrus // outputs 0
apple ||= walrus // outputs 9
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

var apple, walrus;
apple = 0;
walrus = 9;
if (apple == null) apple = walrus;
apple || (apple = walrus);
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,?=明确检查的东西是nullundefined在JS.这是非常不同的||=,只依赖于是否apple是一个虚假的价值.

要扩展一点apple ||= walrus就意味着相同apple = apple || walrus,所以苹果的任何价值都会使逻辑短路而不会改变苹果的价值.

  • (对于随意读者:`undefined == null`在JavaScript中是真的.`undefined`和`null`,两个false-y值,是*x`的*only*值,导致`x == null`是真的.) (2认同)