JavaScript:`if(!x)`和`if(x == null)`有什么区别?

时间:2011-04-26 13:35:59

标签: javascript

if (!x)if (x == null)之间有什么区别;也就是说,什么时候他们的结果会有所不同?

6 个答案:

答案 0 :(得分:50)

!x会为每个“假”值返回true(空字符串,0nullfalseundefined,{ {1}})如果NaN x == null编辑:或显然),则true只会返回x null(见下文))。

尝试undefined,有区别。

您可以说NOT运算符x = 0 值转换为其相反的布尔值。这与实际比较两个值不同。

此外,如果您将值与!进行比较,则JavaScript会type conversion,这会导致意外行为(例如==)。最好始终使用严格比较undefined == null(值和类型必须相同),并且只有在您真正知道自己在做什么时才使用类型转换。

要阅读的内容:


更新:

有关===null(或一般比较)的非严格比较的详细信息,请查看specification。比较算法在那里定义(比较为undefined):

  
      
  1. 如果Type( x )与Type( y )相同,那么
      (...)
  2.   
  3. 如果 x null y 未定义,请返回 true
  4.   
  5. 如果 x 未定义 y null ,请返回 true
  6.   
  7. (...)
  8.         

    (...)

答案 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的任何值都是如此。对于false0等等的排列,这将是真实的。

x == null有所不同,因为var x = 0不会为空...但会是假的。

答案 5 :(得分:0)

这个问题/答案有一些isTrue isFalse函数可能对人们有所帮助:

forgiving isTrue isFalse