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 次 |
| 最近记录: |