这是一个coffeescript错误?解构与存在运算符

时间:2017-06-06 20:31:37

标签: coffeescript

遵循coffeescript代码:

{ baz } = @foo.bar?

产生

var baz;
baz = (this.foo.bar != null).baz;

但我希望:

var ref, baz;
if ((ref = this.foo.bar) != null) {
  baz = ref.baz;
}

是错误还是预期的行为?

1 个答案:

答案 0 :(得分:4)

我认为您将一元?运算符与二元?.运算符混淆。

此表达式的右侧:

baz = @foo.bar?.baz

...使用二进制?.运算符。如您所知,它返回后续属性的值(如果存在),否则返回null(并将其他属性的短路评估)。

另一方面,这个表达式的RHS:

{ baz } = @foo.bar?

...使用一元?运算符。如果其操作数(前一个表达式)为falsenull,则返回undefined,否则返回true

这是一个非常容易犯的错误;你可以在this CoffeeScript issue看到有人问同样的问题。使问题更加复杂的是,CoffeeScript文档甚至不会给这两个运营商提供不同的名称。他们致电? "existential operator"?.存在运营商的"访问者变体。"