繁体   English   中英

为什么|| =未编译,如果我们不使用[],则在coffeescript中编译?

[英]Why || = not compiled such that if we use [] or not, in coffeescript?

为什么会有这种差异:

class Foo
  getTest: ->
    @test ||= 42

编译为:

return this.test || (this.test = 42);

不同的

class Foo
  getTest: ->
    @test['bar'] ||= 42

编译在:

var _base;
return (_base = this.test)['bar'] || (_base['bar'] = 42);

这个变量“ _base”的作用是什么?

return this.test['bar'] || (this.test['bar'] = 42);

也是个好方法,不是吗?

谢谢。

||=需要考虑两大类结构:

simple_expr  ||= x
complex_expr ||= x

一个简单的表达式就像@test一样@test可能)没有副作用,并且(可能)对它进行两次评估不会降低性能。

复杂表达式可以是其他任何东西: @test['x']@test(11).pancakes ,...复杂表达式可能会产生副作用,也可能会很昂贵,因此您只需要对它们进行一次评估。

现在考虑对expr1进行多少次评估:

expr1 || (expr1 = expr2)

有时expr1将被计算两次,CoffeeScript的是积攒尽可能多的expr1 ,因为它可以在_base避免费用和评估可能的副作用expr1的两倍。

您可能还会注意到,对于简单的表达式,唯一可以存储在_base是整个表达式本身。 我怀疑他们实际上是默认情况下考虑所有复杂的表达式,然后在事实证明没有东西要_base_base

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM