2013-06-22 44 views
5

Coffeescript使用存在操作符来确定何时存在一个变量,并在coffeescript documentation它显示something?将编译为something !== undefined && something !== null但是我注意到我的版本的coffeescript只编译something !== null,所以我写了一个测试,看看这将如何影响我的代码CoffeeScript的存在操作符是如何工作的?

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,为什么这是suficiant?

+0

不是一个确切的问题重复,但答案是一样的:http://stackoverflow.com/questions/9990117/existential-operator-and-object-properties:D – epidemian

回答

21

的文件说,这大约?

CoffeeScript中的生存操作,除非一个变量是未定义?返回true,这使得它类似于Ruby的nil?

这样的当然这会说“没有塔可!”:

taco = undefined 
if taco? 
    console.log "fiesta!" 
else 
    console.log "No taco!" 

您的taco明确undefined因此taco?为false。

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,因此可以使用更严格的!==测试来查看taco是否为null

你这样说:

,我发现我的CoffeeScript的版本只编译这something !== null

但这并不是它在做什么,它实际上是编译成something != null;请注意使用“马虎”式转换不等式(!=)与您声称存在的严格不平等(!==)之间的差异。!=!==之间的区别是很重要的位置since

  • null和undefined类型是==(但不===

所以,如果你知道这个变量v已申报(即有地方有var v),那么v != null就足以检查v既不是null也不是undefined。但是,如果您不知道v已被声明,则当您尝试将未声明的变量与null进行比较时,您需要进行typeof检查以避免出现ReferenceError错误。考虑这个JavaScript:

if(taco != null) { 
    console.log("fiesta!"); 
} else { 
    console.log("No taco!"); 
} 

这将扔在你脸上的ReferenceError因为taco不存在。这:

if(typeof taco !== "undefined" && taco !== null) 
    console.log("fiesta!"); 
} else { 
    console.log("No taco!"); 
} 

,另一方面是因为对试图访问尚未宣布的东西检查typeof卫兵罚款。我不认为你可以在没有使用反引号嵌入JavaScript的情况下构建CoffeeScript中的第一个。

+1

很好的答案。我希望这个问题被贴上标签,“在CoffeeScript中,存在操作符是如何工作的?”所以你的答案更容易找到。相反,我必须喜欢这个问题,这样我才能再次找到它。 –

+3

我一看到“没有塔可! - 这很有趣。 – jcollum

相关问题