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

Coffeescript使用存在运算符来确定变量何时存在,在中,它显示
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);

输出了一些意想不到的
没有玉米卷未定义
,为什么这个值是suficiant

文档中提到了关于

CoffeeScript的存在运算符
返回true,除非变量null未定义,这使得它类似于Ruby的
nil?

所以这当然会说“不要吃玉米卷!”:

您的
taco
是显式
未定义的
,因此
taco?
为假

CoffeeScript隐式声明变量,因此
的JavaScript形式依赖于上下文。例如,如果你只是说:

if taco?
    console.log "fiesta!"
else 
    console.log "No taco!"
您将看到
taco?
变成
typeof taco!==“未定义”&&taco!==空
。您仍然可以看到“IsIt
null
”检查(以更严格的形式),但也可以看到“is at a
var 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!");
}