检查 undefined 和 null 的不等式 (!==) 与仅检查 null 的纠正不等式 (!=) 之间有区别吗?

hug*_*omg 5 javascript coffeescript

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

            compiles to
Coffeescript ------> JS
a?                   typeof a !== "undefined" && a !== null;
Run Code Online (Sandbox Code Playgroud)

但如果我使用文字或表达式,它会使用!=比较:

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

//same thing for regexps, strings, function calls and other expressions
//as far as I know.
Run Code Online (Sandbox Code Playgroud)

除了可能让 JSLint 高兴之外,还有什么理由更喜欢 double!==而不是更短的 s吗?!= null

Tre*_*ham 4

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

人们在 CoffeeScript 问题跟踪器上经常询问这个问题。原因是没有在任何地方使用,因为的x != null编译输出(或与 的任何其他比较)如果不存在,则会导致运行时错误。在 Node REPL 上尝试一下:x?x != nullxx

> x != null
ReferenceError: x is not defined
Run Code Online (Sandbox Code Playgroud)

我所说的“不存在”是指 no var x, no ​​,并且您不在参数名称为 的window.x = ...函数中。x(CoffeeScript 编译器无法识别这种window.x情况,因为它不会对您所处的环境做出任何假设。)因此,除非在当前范围内有一个var x声明或命名的参数,否则编译器必须使用它来阻止您的进程避免潜在的崩溃。xtypeof x !== "undefined"