如果我将变量传递给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感到高兴?
答案 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?
这是对的吗?