5

Coffeescript 使用存在运算符来确定变量何时存在,并且在咖啡脚本文档中它显示something?将编译为something !== undefined && something !== null但是我注意到我的咖啡脚本版本只是将其编译为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,为什么这就足够了?

4

1 回答 1

21

文档说明了这一点?

CoffeeScript 的存在运算符?返回 true ,除非变量为nullundefined,这使得它类似于 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!==taconull

你这样说:

我注意到我的咖啡脚本版本只是将其编译为something !== null

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

  • Null 和 Undefined 类型是==(但不是===

因此,如果您知道该变量v已被声明(即在var v某处),那么v != null检查vis 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 中构造第一个。

于 2013-06-22T19:26:53.373 回答