检查不等式(!==)与undefined和null之间是否存在差异,只检查对于null的corcive不等式(!=)?

时间:2011-12-01 03:08:48

标签: javascript coffeescript

如果我将变量传递给Coffescript中的存在运算符,它将转换为一对!==比较:

            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.

是否有理由更喜欢双!== s而不是!= null,而另一些可能让JSLint感到高兴?

2 个答案:

答案 0 :(得分:4)

简短回答:它们在行为上是等效的,而!= null编译是一种优化。不管怎样,x?表示x既不是null也不是undefined

人们在CoffeeScript问题跟踪器上问了很多这个问题。由于x != null的编译输出x?(或对x != null的任何其他比较)x导致运行时错误x,因此> x != null ReferenceError: x is not defined 未在任何地方使用的原因var x }不存在。在Node REPL上尝试:

window.x = ...

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

答案 1 :(得分: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?

这是对的吗?