CoffeeScript存在运算符如何工作?

时间:2013-06-22 18:04:34

标签: coffeescript existential-operator

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以及为什么这是有效的?

1 个答案:

答案 0 :(得分:21)

文档说明了?

  

CoffeeScript的存在运算符?返回true,除非变量是 null undefined ,这使得它类似于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”格式(以更严格的形式),但还有typeof的“var taco”支票;请注意,typeof taco测试还会检查taco = undefined,因此可以使用更严格的!==测试来查看taco是否为null

你这样说:

  

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

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

非常重要
  
      
  • 空和未定义类型为==(但不是===
  •   

因此,如果您知道已声明变量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中的第一个。