2013-06-22 71 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

相關問題