遵循coffeescript代码:
{ baz } = @foo.bar?
产生
var baz;
baz = (this.foo.bar != null).baz;
但我希望:
var ref, baz;
if ((ref = this.foo.bar) != null) {
baz = ref.baz;
}
是错误还是预期的行为?
答案 0 :(得分:4)
我认为您将一元?
运算符与二元?.
运算符混淆。
此表达式的右侧:
baz = @foo.bar?.baz
...使用二进制?.
运算符。如您所知,它返回后续属性的值(如果存在),否则返回null
(并将其他属性的短路评估)。
另一方面,这个表达式的RHS:
{ baz } = @foo.bar?
...使用一元?
运算符。如果其操作数(前一个表达式)为false
或null
,则返回undefined
,否则返回true
。
这是一个非常容易犯的错误;你可以在this CoffeeScript issue看到有人问同样的问题。使问题更加复杂的是,CoffeeScript文档甚至不会给这两个运营商提供不同的名称。他们致电?
"existential operator"和?.
存在运营商的"访问者变体。"