Loo*_*urr 5 coffeescript existential-operator
Coffeescript使用存在运算符来确定变量何时存在,并且在coffeescript文档中它显示something?
会编译到something !== undefined && something !== null
但是我注意到我的coffeescript版本只是编译它something !== null
所以我写了一个测试来看看这将如何影响我的代码
taco = undefined
if taco?
console.log "fiesta!"
else
console.log "No taco!"
Run Code Online (Sandbox Code Playgroud)
编译为
// 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);
Run Code Online (Sandbox Code Playgroud)
并输出了一些意外,No taco!
所以我的问题是两倍.为什么coffeescript不再检查价值是什么undefined
以及为什么这是有效的?
mu *_*ort 21
文档说明了这个?
:
?
除非变量为null或未定义,否则CoffeeScript的存在运算符返回true ,这使得它类似于Rubynil?
所以当然会说"没有炸玉米饼!":
taco = undefined
if taco?
console.log "fiesta!"
else
console.log "No taco!"
Run Code Online (Sandbox Code Playgroud)
你taco
是明确的,undefined
所以taco?
是假的.
CoffeeScript隐式声明变量,因此JavaScript形式?
依赖于上下文.例如,如果你只是这样说:
if taco?
console.log "fiesta!"
else
console.log "No taco!"
Run Code Online (Sandbox Code Playgroud)
你会看到它taco?
变成了typeof taco !== "undefined" && taco !== null
.你仍然看到"是它null
"检查(以更严格的形式),但也有"有一个var taco
"检查typeof
; 注意,typeof taco
测试还检查taco = undefined
这么严格的!==
测试可以看到,如果taco
是null
.
你这样说:
我注意到我的coffeescript版本只是编译它
something !== null
但这不是它正在做的事情,它实际上正在编译something != null
; 注意使用"草率"类型转换不等式(!=
)与!==
你声称存在的严格不等式().之间!=
和之间的区别!==
非常重要,因为:
- 空和未定义的类型是
==
(但不是===
)
所以,如果你知道这个变量v
已经声明(即不存在var v
的地方),然后v != null
是足以检查v
既不是null
也不是undefined
.但是,如果您不知道v
已声明,那么typeof
当您尝试比较未声明的变量时,需要检查以避免ReferenceError null
.考虑这个JavaScript:
if(taco != null) {
console.log("fiesta!");
} else {
console.log("No taco!");
}
Run Code Online (Sandbox Code Playgroud)
因为taco
不存在,所以会在你的脸上抛出一个ReferenceError .这个:
if(typeof taco !== "undefined" && taco !== null)
console.log("fiesta!");
} else {
console.log("No taco!");
}
Run Code Online (Sandbox Code Playgroud)
另一方面很好,因为typeof
检查防止试图访问尚未声明的内容.我不认为你可以在没有使用反引号嵌入JavaScript的情况下构建CoffeeScript中的第一个.
归档时间: |
|
查看次数: |
4016 次 |
最近记录: |