2013-10-10 72 views
0

這個話題類似: CoffeeScript Existential Operator and this咖啡生存運營商不同compliations

的CoffeeScript中,我使用的是貓王運營商有一個問題:

foo = -> 
    y = foo() 
    console.log 'y is null' unless y? 
    console.log 'x is null' unless x? 

編譯爲:

var foo, y; 
foo = function() {}; 
y = foo(); 
if (y == null) { 
    console.log('y is null'); 
} 
if (typeof x === "undefined" || x === null) { 
    console.log('x is null'); 
} 

輸出:

y is null 
x is null 

所以問題是,因爲y早些時候被指定咖啡採用了捷徑,並假定y不能被定義。但是,從函數返回undefined是有效的。

是否有一種「安全」的方式來檢查y也不是未定義的?

修訂 澄清實施例和說明:

從評論,在第一if語句(Y == NULL)是利用雙等於代替(X ===空)三重相等的,如在第二條if語句。聰明。

+0

我想你在這裏混淆了三個不同的東西:(1)'y'是否存在/是否被聲明? (2)'y'的值是'undefined'嗎? (3)'y'的值是否爲'null'? – flow

回答

3

?操作員總是檢查該值是否既不是null也不是undefined

y == null是檢查的y值是在JavaScript或者nullundefined絕對正確的方式。

例如,以下CofeeScript代碼檢查僅null值:

do_something() if y is null 

其編譯成

if (y === null) do_something(); 

所以,雖然y?y == null在JS)檢查二者nullundefinedy isnt null(JS中的y !== null)僅檢查null

檢查this answer瞭解更多詳細信息。

有關JavaScript中的等式檢查的更多信息,請參閱this answer

+0

「?運算符總是檢查該值是否爲空也不是未定義的。」那就是我的想法,但在上面的示例中,它不檢查僅未定義的null。所以y被分配到未定義,然後檢查失敗對空。 – bryce

+2

@bryce仔細看看你的例子,它會檢查'y == null',它實際上是'null'或'undefined'。真正的'null'檢查是'y === null'而不是'y == null',參見上面的示例。 –

+0

@bryce查看[這個答案](http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons)瞭解更多關於平等的信息在JavaScript中檢查。 –