Coffeescript使用存在运算符来确定变量何时存在,并在coffeescript documentation中显示something?
将编译为something !== undefined && something !== null
但是我注意到我的coffeescript版本只是编译这到something !== null
所以我写了一个测试,看看这将如何影响我的代码
taco = undefined
if taco?
console.log "fiesta!"
else
console.log "No taco!"
编译为
// Generated by CoffeeScript 1.4.0
(function() {
var taco;
taco = void 0;
if (taco != null) {
console.log("fiesta!");
} else {
console.log("No taco!");
}
}).call(this);
输出了一些意想不到的No taco!
,所以我的问题是双重的。为什么coffeescript不再检查值undefined
以及为什么这是有效的?
答案 0 :(得分:21)
文档说明了?
:
CoffeeScript的存在运算符
?
返回true,除非变量是 null 或 undefined ,这使得它类似于Ruby的nil?
所以当然这会说“没有炸玉米饼!”:
taco = undefined
if taco?
console.log "fiesta!"
else
console.log "No taco!"
您的taco
明确undefined
,因此taco?
为假。
CoffeeScript隐式声明变量,因此?
的JavaScript形式依赖于上下文。例如,如果你只是这样说:
if taco?
console.log "fiesta!"
else
console.log "No taco!"
您会看到taco?
变为typeof taco !== "undefined" && taco !== null
。您仍然可以看到“是null
”格式(以更严格的形式),但还有typeof
的“var taco
”支票;请注意,typeof taco
测试还会检查taco = undefined
,因此可以使用更严格的!==
测试来查看taco
是否为null
。
你这样说:
我注意到我的coffeescript版本只是将其编译为
something !== null
但这不是它正在做的事情,它实际上正在编译为something != null
;请注意使用“草率”类型转换不等式(!=
)与您声称存在的严格不等式(!==
)。 !=
和!==
之间的区别在since:
- 空和未定义类型为
==
(但不是===
)
因此,如果您知道已声明变量v
(即某处有var v
),则v != null
足以检查v
是否null
} undefined
。但是,如果您不知道已声明v
,那么当您尝试将未声明的变量与typeof
进行比较时,需要进行null
检查以避免ReferenceError。考虑一下这个JavaScript:
if(taco != null) {
console.log("fiesta!");
} else {
console.log("No taco!");
}
由于taco
不存在,因此会抛出一个ReferenceError。这样:
if(typeof taco !== "undefined" && taco !== null)
console.log("fiesta!");
} else {
console.log("No taco!");
}
另一方面,很好,因为typeof
检查防止尝试访问尚未声明的内容。我不认为你可以在没有使用反引号嵌入JavaScript的情况下构建CoffeeScript中的第一个。