没有@
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
时,我希望检查?
我错过了哪些内容?
答案 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不会这样做。如果您想要专门检查根本不存在的成员,则必须手动执行此操作。