if (!x)
和if (x == null)
之间有什么区别;也就是说,什么时候他们的结果会有所不同?
答案 0 :(得分:50)
!x
会为每个“假”值返回true
(空字符串,0
,null
,false
,undefined
,{ {1}})如果NaN
x == null
(编辑:或显然),则true
只会返回x
null
(见下文))。
尝试undefined
,有区别。
您可以说NOT运算符x = 0
将值转换为其相反的布尔值。这与实际比较两个值不同。
此外,如果您将值与!
进行比较,则JavaScript会type conversion,这会导致意外行为(例如==
)。最好始终使用严格比较undefined == null
(值和类型必须相同),并且只有在您真正知道自己在做什么时才使用类型转换。
要阅读的内容:
更新:
有关===
和null
(或一般比较)的非严格比较的详细信息,请查看specification。比较算法在那里定义(比较为undefined
):
- 如果Type( x )与Type( y )相同,那么
(...)- 如果 x null 且 y 未定义,请返回 true 。
- 如果 x 未定义且 y null ,请返回 true 。
- (...)
醇>(...)
答案 1 :(得分:4)
如果x为false,NaN,''(空字符串),undefined(使用严格比较运算符===)或0(零),结果可能不同。
有关类型比较的精彩摘要,请参阅Felix Kling's answer。
答案 2 :(得分: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不是真正的值”,但只有在X未定义或null的情况下才会显示“X为空”。
当X是布尔值时,如果X为假,则(!x)
为真,但(x == null)
不为。对于数字0和NaN被认为是假值,因此X不是真正的。
See it in action,包括==
(使用类型转换的相等)和===
(严格相等)之间的差异
答案 3 :(得分:2)
if (!x)
强制x使用内部ToBoolean函数
if (x==null)
使用内部ToPrimitive函数强制执行两个操作数(通常将每一侧解析为数字,偶尔将字符串解析为操作数)
有关ToBoolean与ToPrimitive的完整解释,请参阅http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
答案 4 :(得分:1)
!x
测试错误值。对于因任何原因可以传播为false的任何值都是如此。对于false
,0
等等的排列,这将是真实的。
x == null
有所不同,因为var x = 0
不会为空...但会是假的。
答案 5 :(得分:0)
这个问题/答案有一些isTrue isFalse函数可能对人们有所帮助: