我注意到CoffeeScript编译器有点奇怪,并且想知道这是否是正确的行为.如果它是正确的我很好奇为什么会有区别..
鉴于以下CoffeeScript:
if @myVar?
alert myVar
Run Code Online (Sandbox Code Playgroud)
我期待它像这样编译成JavaScript:
if (typeof this.myVar !== "undefined" && this.myVar !== null) {
alert(myVar);
}
Run Code Online (Sandbox Code Playgroud)
但相反,CoffeeScript编译器输出的是:
if (this.myVar != null) {
alert(myVar);
}
Run Code Online (Sandbox Code Playgroud)
如果我不引用此(或任何其他父对象),CoffeeScript将按照我的预期进行编译.
这是正确的行为吗?如果是这样,为什么使用它时它会有所不同?
编辑:
添加一点澄清.仅在此情况下不会发生这种情况,而是对象的任何其他属性.例如,如果我用下面的内容替换上面的CoffeeScript,它仍然只用"!= null"编译...
if myVar.myProp?
alert myVar
Run Code Online (Sandbox Code Playgroud)
max*_*kin 14
如果是:
myVar = 10
if myVar?
alert myVar
Run Code Online (Sandbox Code Playgroud)
Coffeescript编译器能够看到myVar第一行中确实定义了它,因此它可以省略typeof myVar !== "undefined"检查.
if (myVar !== null) {
alert(myVar);
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下:
if myVar?
alert myVar
Run Code Online (Sandbox Code Playgroud)
编译器无法保证myVar实际定义,因此需要额外检查:
if (typeof myVar !== "undefined" && myVar !== null) {
alert(myVar);
}
Run Code Online (Sandbox Code Playgroud)
所以,答案是:Coffeescript编译器试图聪明地生成有效的代码.
编辑
Coffeescript处理属性的方式也是正确的:如果未定义属性,this.prop将返回undefined.!=将它转换为null.这就是我们不需要额外检查的原因.
简而言之:
typeofundefined- 就!=足够了| 归档时间: |
|
| 查看次数: |
3554 次 |
| 最近记录: |