2011-04-26 90 views
17

if (!x)if (x == null)之間的區別是什麼?也就是說,他們的結果何時會不同?JavaScript:if(!x)`和if(x == null)`有什麼區別?

+0

http://stackoverflow.com/questions/801032/null-object-in-javascript – 2011-04-26 13:38:33

+4

我愛[文章](HTTP://javascriptweblog.wordpress。 COM/2011/02/07 /真理平等和JavaScript的/)。你知道嗎?'a'== false和'a'== true'都是'false'=)是的。去搞清楚。 – Rudie 2011-05-02 23:52:42

+0

@Rudie:蘋果不是橙子,蘋果不是香蕉。那有什麼問題? – Bergi 2014-01-18 15:56:42

回答

46

!x將返回true爲每一個 「falsy」 值(空字符串,0nullfalseundefinedNaN),而x == null只會返回true如果xnull編輯:或明顯undefined(見下面))。

試用x = 0,有區別。

您可以說NOT運算符!的值轉換爲其相反的布爾等值。這與實際比較兩個值不同。

此外,如果您將值與==進行比較,JavaScript確實會導致type conversion這可能導致意外的行爲(如undefined == null)。最好始終使用嚴格比較===(值和類型必須相同),並且只有在您確實知道自己在做什麼時才使用類型轉換。

東西可以讀:


更新:

有關nullundefined(或一般比較)的非嚴格比較的更多信息,值得看看specification。比較算法被定義有(比較是x == y):

  1. 如果Type(X)是相同的類型(Ý),然後
    (...)
  2. 如果Xÿ不確定,返回真正
  3. 如果X不確定ÿ,返回真正
  4. (...)

(...)

+5

「undefined == null」也會返回true。這就是爲什麼你最好使用「x === null」。 – fforw 2011-04-26 13:41:57

+0

@justkt,@fforw:謝謝,更新了我的答案。 – 2011-04-26 13:45:24

+0

@downvoter:請解釋一下,以便我可以更正/改進我的答案。哪裏不對? – 2011-07-07 08:14:14

4

結果可以是不同的,如果x是假的,NaN時, ''(空字符串),未定義的(使用嚴格比較運算符===),或0(零)。

請參閱Felix Kling's answer瞭解類型比較的優秀摘要。

+0

未定義類型強制爲空,因此(x == null)對於未定義的對象爲true,但(x === null)不是。 – justkt 2011-04-26 13:48:07

+0

是好抓住@justkt,我會更新答案爲未來的參考。 – 2011-04-26 13:49:13

2

說x是一個字符串。

x = undefined; 
if(!x) { 
    alert("X is not a truthy value"); 
} 
if(x == null) { 
    alert("X is null"); 
} 

x = ""; 
if(!x) { 
    alert("X is not a truthy value"); 
} 
if(x == null) { 
    alert("X is null"); 
} 

x = null; 
if(!x) { 
    alert("X is not a truthy value"); 
} 
if(x == null) { 
    alert("X is null"); 
} 

你會發現,「X不是truthy值」,在這三種情況下被顯示,但僅在X是未定義或爲空的情況下,是「X爲空」表示。

當X是布爾值時,當X爲假但(x == null)不會是時,(!x)將爲真。對於數字0和NaN被認爲是錯誤的值,所以不是X是真的。

See it in action,包括之間==

1

!x測試爲假值(使用類型轉換平等)和===(全等)之差。對於任何可能因任何原因而傳播爲假的值,這都是正確的。這將是真正爲false0,等等等等排列

x == null是不同的,因爲var x = 0不會是空...但將是錯誤的。

相關問題