2011-12-01 60 views
4

如果我在Coffescript傳遞變量的存在操作者將它轉換成一對!==比較:檢查不等式(!==)與undefined和null是否有區別,只是針對null檢查corcive不等式(!=)?

  compiles to 
Coffeescript ------> JS 
a?     typeof a !== "undefined" && a !== null; 

但是,如果使用一個文字或表達它,而不是使用一個!=比較:

  compiles to 
Coffeescript ------> JS 
17?     17 != null; 

//same thing for regexps, strings, function calls and other expressions 
//as far as I know. 

是否有任何理由在較短!= null寧願雙!== S,其他的話,或許使JSLint的幸福嗎?

回答

4

簡短回答:它們在行爲上是等效的,!= null編譯是一個優化。無論哪種方式,x?意味着x既不是null也不undefined

人們問這個對CoffeeScript的問題跟蹤了很多。其原因x != null不使用任何地方的x?編譯後的輸出是x != null(或針對x任何其他的比較)如果x不存在導致運行時錯誤。嘗試在節點REPL:

> x != null 
ReferenceError: x is not defined 

通過「不存在,」我的意思是沒有var x,沒有window.x = ...,你的功能中x是一個參數的名稱不是。 (該CoffeeScript的編譯器無法識別window.x情況,因爲它不會使你所處的環境做任何假設。)所以,除非有一個var x聲明或在當前範圍內命名x參數,編譯器必須使用typeof x !== "undefined"以防止您的進程可能崩潰。

1

我能理解爲什麼人們覺得還不清楚。在ECMAScript中:

a? 

等同於:

typeof a !== 'undefined' && a !== undefined && a !== null && a !== 0 && a !== false && a !== ''; 

的CoffeeScript的重構來:

typeof a !== "undefined" && a !== null; 

意味着:

var a = false; 
a?; // evaluates to true? 

是正確的嗎?

+1

是的,的確如此。 ?是存在的運營商。它意在表明變量是否存在。 – liammclennan

+0

@RobG讓他們成爲一個新的操作員是有道理的。我們已經有了'!!'用於虛假評估 – hugomg

+0

@liammclennan - 那個測試並沒有告訴你任何有關變量是否存在的事情,它只是提供了一個關於它的價值不是什麼的暗示。 @missingno - 重載'?'操作符似乎不是一個好主意,它只是速記,並且(對我來說)混淆了代碼。 – RobG