“if (!x)” 和 “if (x == null)” 有什么区别?即,在什么情况下它们的结果可能不同?
!x
会对每个“falsy”值(空字符串,0
,null
,false
,undefined
,NaN
)返回true
,而x == null
只有在x
确实是null
时才会返回true
(编辑:或者显然是undefined
(见下文))。
使用x = 0
尝试,这里有一个差异。
你可以说NOT运算符!
将一个值转换为其相反的布尔等价物。这与实际比较两个值不同。
此外,如果用==
比较值,JavaScript会进行类型转换,这可能导致意外行为(例如undefined == null
)。最好始终使用严格比较===
(值和类型必须相同),只有在确实知道自己在做什么时才使用类型转换。
一些阅读材料:
更新:
有关于null
和undefined
的非严格比较(或者一般性的比较)的更多信息,值得查看规范。比较算法在这里被定义了(比较是x == y
):
- 如果Type(x)和Type(y)相同,则
(...)- 如果x为null并且y为undefined,则返回true。
- 如果x为undefined并且y为null,则返回true。
- (...)
(...)
如果x为false、NaN、''(空字符串)、undefined(使用严格比较运算符===)或0(零),则结果可能会有所不同。
请参阅Felix Kling的回答,了解类型比较的优秀概述。
if (!x)
强制转换 x 使用内部的 ToBoolean 函数
if (x==null)
使用内部的ToPrimitive函数来强制转换两个操作数(通常将每个操作数解析为一个数字,偶尔是一个字符串,具体取决于操作数)
有关ToBoolean与ToPrimitive的完整解释,请参见http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
假设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)
在X为false时为真,但(x == null)
不为真。对于数字来说,0和NaN被认为是假值,因此非X为真值。
在这里查看示例,包括使用类型转换的相等性==
和严格相等性===
之间的差异。!x
测试假值。对于任何因素可以传播为false的值,这将为真。这将对false
、0
等的排列组合为真。
x == null
是不同的,因为var x = 0
不会是null...但会是false。
'a' == false
和'a' == true
都是false
=) 是啊,有点难以理解。 - Rudie'a' == false
和'a' == true
都是false
。或者你想再谈谈水果吗? - Rudie