2011-12-01 64 views
4

如果我在Coffescript传递变量的存在操作者将它转换成一对!==比较:检查不等式(!==)与undefined和null是否有区别,只是针对null检查corcive不等式(!=)?

  compiles to 
Coffeescript ------> JS 
a?     typeof a !== "undefined" && a !== null; 

但是,如果使用一个文字或表达它,而不是使用一个!=比较:

  compiles to 
Coffeescript ------> JS 
17?     17 != null; 

//same thing for regexps, strings, function calls and other expressions 
//as far as I know. 

是否有任何理由在较短!= null宁愿双!== S,其他的话,或许使JSLint的幸福吗?

回答

4

简短回答:它们在行为上是等效的,!= null编译是一个优化。无论哪种方式,x?意味着x既不是null也不undefined

人们问这个对CoffeeScript的问题跟踪了很多。其原因x != null不使用任何地方的x?编译后的输出是x != null(或针对x任何其他的比较)如果x不存在导致运行时错误。尝试在节点REPL:

> x != null 
ReferenceError: x is not defined 

通过“不存在,”我的意思是没有var x,没有window.x = ...,你的功能中x是一个参数的名称不是。 (该CoffeeScript的编译器无法识别window.x情况,因为它不会使你所处的环境做任何假设。)所以,除非有一个var x声明或在当前范围内命名x参数,编译器必须使用typeof x !== "undefined"以防止您的进程可能崩溃。

1

我能理解为什么人们觉得还不清楚。在ECMAScript中:

a? 

等同于:

typeof a !== 'undefined' && a !== undefined && a !== null && a !== 0 && a !== false && a !== ''; 

的CoffeeScript的重构来:

typeof a !== "undefined" && a !== null; 

意味着:

var a = false; 
a?; // evaluates to true? 

是正确的吗?

+1

是的,的确如此。 ?是存在的运营商。它意在表明变量是否存在。 – liammclennan

+0

@RobG让他们成为一个新的操作员是有道理的。我们已经有了'!!'用于虚假评估 – hugomg

+0

@liammclennan - 那个测试并没有告诉你任何有关变量是否存在的事情,它只是提供了一个关于它的价值不是什么的暗示。 @missingno - 重载'?'操作符似乎不是一个好主意,它只是速记,并且(对我来说)混淆了代码。 – RobG