if (!x)
和if (x == null)
之間的區別是什麼?也就是說,他們的結果何時會不同?JavaScript:if(!x)`和if(x == null)`有什麼區別?
回答
!x
將返回true
爲每一個 「falsy」 值(空字符串,0
,null
,false
,undefined
,NaN
),而x == null
只會返回true
如果x
是null
(編輯:或明顯undefined
(見下面))。
試用x = 0
,有區別。
您可以說NOT運算符!
將的值轉換爲其相反的布爾等值。這與實際比較兩個值不同。
此外,如果您將值與==
進行比較,JavaScript確實會導致type conversion這可能導致意外的行爲(如undefined == null
)。最好始終使用嚴格比較===
(值和類型必須相同),並且只有在您確實知道自己在做什麼時才使用類型轉換。
東西可以讀:
更新:
有關null
和undefined
(或一般比較)的非嚴格比較的更多信息,值得看看specification。比較算法被定義有(比較是x == y
):
- 如果Type(X)是相同的類型(Ý),然後
(...)- 如果X是空和ÿ是不確定,返回真正。
- 如果X是不確定和ÿ是空,返回真正。
- (...)
(...)
「undefined == null」也會返回true。這就是爲什麼你最好使用「x === null」。 – fforw 2011-04-26 13:41:57
@justkt,@fforw:謝謝,更新了我的答案。 – 2011-04-26 13:45:24
@downvoter:請解釋一下,以便我可以更正/改進我的答案。哪裏不對? – 2011-07-07 08:14:14
結果可以是不同的,如果x是假的,NaN時, ''(空字符串),未定義的(使用嚴格比較運算符===),或0(零)。
請參閱Felix Kling's answer瞭解類型比較的優秀摘要。
未定義類型強制爲空,因此(x == null)對於未定義的對象爲true,但(x === null)不是。 – justkt 2011-04-26 13:48:07
是好抓住@justkt,我會更新答案爲未來的參考。 – 2011-04-26 13:49:13
說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,包括之間==
!x
測試爲假值(使用類型轉換平等)和===
(全等)之差。對於任何可能因任何原因而傳播爲假的值,這都是正確的。這將是真正爲false
,0
,等等等等排列
x == null
是不同的,因爲var x = 0
不會是空...但將是錯誤的。
if (!x)
脅迫X使用內部ToBoolean功能
if (x==null)
使用內部ToPrimitive函數(其通常解析每一側爲數字,偶爾一個字符串,根據操作數)
脅迫兩個操作數ToBoolean vs ToPrimitive的完整解釋請參見http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
這個問題有一些isTrue isFal SE功能可以幫助人們:
- 1. Python中的if bool(x)`和if x`有什麼區別嗎?
- 2. 「x is null」和「x == null」有什麼區別?
- 3. object x = null和object x =(object)null有什麼區別?
- 4. int [] x;有什麼區別?和int x [];?
- 5. 「x!」有什麼區別和「x」?
- 6. (void **)&x和(void *)x有什麼區別?
- 7. 'x'和'x'有什麼區別?
- 8. null == x和x == null之間的區別?
- 9. C++中if(x^1!= 1)和if(int(x^1)!= 1)有什麼區別?
- 10. float x []與float [] x有什麼區別?
- 11. $('x> y'),$('y','x')和$('x y')之間有什麼區別?
- 12. 對於1-D`X`,`X [n]`和`X [...,n]`有什麼區別?
- 13. H.264和x.264有什麼區別?
- 14. C++中0x和'\ x'有什麼區別?
- 15. ng-show和ng-if在angular 1.x中有什麼區別?
- 16. 「x IS NULL」和「NOT(x IS NOT NULL)」之間的區別是什麼?
- 17. Python:「import X」和「from X import *」有什麼區別?
- 18. 過濾器(| x |)和過濾器(|&x |)之間有什麼區別?
- 19. ruby中`| x,y |`和`| x; y = 0 |`有什麼區別?
- 20. Y〜X和Y〜X + 1有什麼區別?
- 21. OpenGL GLSL中的atan(y/x)和atan2(y,x)有什麼區別
- 22. 在python 2.7「x!= y」和「not x == y」之間有什麼區別?
- 23. python3有什麼區別? <x>和python3。 <x> m
- 24. Func <x,y>和Method(x,y)有什麼區別?
- 25. C++:int * x [5]和int(* x)[5]之間有什麼區別?
- 26. 「Object [] x」和「Object x []」有什麼區別嗎?
- 27. 「module self :: X」和「module X」有什麼區別?
- 28. python 3中print(x)`和print(* x)`有什麼區別?
- 29. 演員之間有什麼區別:(A)x和x爲A?
- 30. emacs中'M-x load-file'和'M-x load-library'有什麼區別?
http://stackoverflow.com/questions/801032/null-object-in-javascript – 2011-04-26 13:38:33
我愛[文章](HTTP://javascriptweblog.wordpress。 COM/2011/02/07 /真理平等和JavaScript的/)。你知道嗎?'a'== false和'a'== true'都是'false'=)是的。去搞清楚。 – Rudie 2011-05-02 23:52:42
@Rudie:蘋果不是橙子,蘋果不是香蕉。那有什麼問題? – Bergi 2014-01-18 15:56:42