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

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这么严格的!==测试可以看到,如果taconull.

你这样说:

我注意到我的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中的第一个.

  • 我一见到"没有炸玉米饼!"就立刻投了赞成票. - 这很有趣. (3认同)