CoffeeScript';存在算子的工作是什么?
Coffeescript使用存在运算符来确定变量何时存在,在中,它显示CoffeeScript';存在算子的工作是什么?,coffeescript,existential-operator,Coffeescript,Existential Operator,Coffeescript使用存在运算符来确定变量何时存在,在中,它显示something?将编译为something!==未定义的内容(&&something!==空但是我注意到我的coffeescript版本只是将其编译成某种东西!==null所以我写了一个测试,看看这会如何影响我的代码 taco = undefined if taco? console.log "fiesta!" else console.log "No taco!" 编译为 // Generated
something?
将编译为something!==未定义的内容(&&something!==空
但是我注意到我的coffeescript版本只是将其编译成某种东西!==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);
输出了一些意想不到的
没有玉米卷所以我的问题是双重的。为什么coffeescript不再检查值未定义
,为什么这个值是suficiant 文档中提到了关于?
:
CoffeeScript的存在运算符?
返回true,除非变量null或未定义,这使得它类似于Ruby的nil?
所以这当然会说“不要吃玉米卷!”:
您的taco
是显式未定义的
,因此taco?
为假
CoffeeScript隐式声明变量,因此?
的JavaScript形式依赖于上下文。例如,如果你只是说:
if taco?
console.log "fiesta!"
else
console.log "No taco!"
您将看到taco?
变成typeof taco!==“未定义”&&taco!==空
。您仍然可以看到“IsItnull
”检查(以更严格的形式),但也可以看到“is at avar taco
”检查;请注意,typeoftaco
测试还检查taco=undefined
,因此更严格的==代码>测试可用于查看taco
是否为null
你这样说:
我注意到我的coffeescript版本只是把它编译成什么东西!==空
但这不是它所做的,它实际上是编译成某种东西!=空
;请注意,与您声称存在的严格不等式(!=
)相比,使用了“草率”类型的转换不等式(!=
)。之间的区别=代码>和==代码>在这里很重要:
- Null和未定义的类型是
=
(但不是==
)
因此,如果您知道变量v
已声明(即,某处存在var v
),则v!=null
足以检查v
既不是null
也不是undefined
。但是,如果您不知道已声明了v
,则需要进行typeof
检查,以避免在尝试将未声明的变量与null
进行比较时出现引用错误。考虑这个JavaScript:
if(taco != null) {
console.log("fiesta!");
} else {
console.log("No taco!");
}
这将给您带来一个参考错误,因为taco
不存在。这:
if(typeof taco !== "undefined" && taco !== null)
console.log("fiesta!");
} else {
console.log("No taco!");
}
另一方面,由于检查的typeof
check可以防止试图访问未声明的内容,因此也可以。我认为在CoffeeScript中构建第一个问题时,如果不使用backticks嵌入JavaScript,是不可能的。这不是一个完全相同的问题,但答案是相同的::DGreat answer。我希望这个问题被标注为“在CoffeeScript中,存在主义操作符是如何工作的?”这样你的答案就更容易找到了。相反,我必须喜欢这个问题,这样我才能再次找到这个问题。
if(typeof taco !== "undefined" && taco !== null)
console.log("fiesta!");
} else {
console.log("No taco!");
}