gpt4 book ai didi

coffeescript - CoffeeScript 的存在运算符是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 16:24:39 27 4
gpt4 key购买 nike

Coffeescript 使用存在运算符来确定变量何时存在,并且在 coffeescript documentation 中它表明 something?将编译为 something !== undefined && something !== null但是我注意到我的 CoffeeScript 版本只是将其编译为 something !== 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);

并输出了一些出乎意料的 No taco!所以我的问题是双重的。为什么 coffeescript 不再检查 undefined 的值为什么这就足够了?

最佳答案

文档中提到了 ? :

CoffeeScript's existential operator ? returns true unless a variable is null or undefined, which makes it analogous to Ruby's nil?



所以当然这会说“没有炸 Jade 米饼!”:
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 .

你这样说:

I noticed that my version of coffeescript was only compiling this to something !== null



但这不是它正在做的事情,它实际上正在编译为 something != null ;请注意使用“草率”类型转换不等式( != )与您声称存在的严格不等式( !== )。 != 之间的区别和 !==在这里很重要 since :

  • Null and Undefined Types are == (but not ===)


所以如果你知道这个变量 v已声明(即某处有 var v)然后 v != null足以检查 v既不是 null也不是 undefined .但是,如果您不知道 v已声明,那么您需要一个 typeof当您尝试将未声明的变量与 null 进行比较时,请检查以避免出现 ReferenceError .考虑这个 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 中构造第一个。

关于coffeescript - CoffeeScript 的存在运算符是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17253772/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com