文档说明了这一点?:
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”检查(以更严格的形式),但也有“是否有var taco”检查typeof; 请注意,该测试还会typeof taco检查是否为。taco = undefined!==taconull
你这样说:
我注意到我的咖啡脚本版本只是将其编译为something !== null
但这不是它正在做的事情,它实际上正在编译为something != null;请注意使用“草率”类型转换不等式 ( ) 与您声称存在!=的严格不等式 ( )。和!==之间的区别在这里很重要,因为:!=!==
- Null 和 Undefined 类型是
==(但不是===)
因此,如果您知道该变量v已被声明(即在var v某处),那么v != null检查vis notnull或就足够了undefined。但是,如果您不知道它v已被声明,那么typeof当您尝试将未声明的变量与null. 考虑这个 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 中构造第一个。