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