为什么使用问号运算符时编译的javascript之间存在差异

时间:2013-05-30 07:07:38

标签: javascript coffeescript

没有@

alert("Even Number") if even?

对应的Javascript

if (typeof even !== "undefined" && even !== null) {
  alert("Even Number");
}

使用@

alert("Even Number") if @even?

对应的Javascript

if (this.even != null) {
  alert("Even Number");
}

当我使用undefined运算符和this时,我希望检查?我错过了哪些内容?

2 个答案:

答案 0 :(得分:4)

Coffeecript很聪明。这里的诀窍是将null!=的{​​{1}}进行比较。您不需要检查变量的存在,因为undefined已经是一个对象,您可以通过使用this这样的常规查找来检查属性是否存在,但是如果值为falsy(false,空字符串等),这就是为什么你需要检查if (this.prop)undefined的原因,如下所示:

null

但是利用类型转换,我们可以使用if (this.prop !== undefined && this.prop !== null) 来简化:

!=

if (this.prop != null) // checks null and undefined null == undefined

答案 1 :(得分:3)

如果引用未定义的变量,JS会引发ReferenceError。如果您引用未定义的对象成员,则会得到undefined。这就是为什么在对null进行测试之前不需要检查对象成员是否存在的原因。

考虑:

var obj = {};

if( obj.foo != null ) {   // this is fine because `obj.foo` is `undefined`
   // ...
}

if( foo != null ) {       // ReferenceError, script execution halts
   // ...
}

换句话说,没有必要防止不存在的对象成员,因此CoffeeScript不会这样做。如果您想要专门检查根本不存在的成员,则必须手动执行此操作。

相关问题