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

23
“if (!x)” 和 “if (x == null)” 有什么区别?即,在什么情况下它们的结果可能不同?

https://dev59.com/f3RA5IYBdhLWcg3w2x2W - Mithun Sreedharan
5
我喜欢这篇文章。你知道吗,'a' == false'a' == true 都是 false =) 是啊,有点难以理解。 - Rudie
@Rudie:一个苹果不是橙子,一个苹果也不是香蕉。这有什么问题吗? - Bergi
@Bergi 没有什么。但是你知道吗,'a' == false'a' == true 都是 false。或者你想再谈谈水果吗? - Rudie
@Rudie:是的,我知道,这很有意义。 - Bergi
2
一个苹果不是橙子,而且一个苹果也不是不是橙子。 - Ian Boyd
5个回答

60
!x会对每个“falsy”值(空字符串,0nullfalseundefinedNaN)返回true,而x == null只有在x确实是null时才会返回true编辑:或者显然是undefined(见下文))。

使用x = 0尝试,这里有一个差异。

你可以说NOT运算符!一个值转换为其相反的布尔等价物。这与实际比较两个值不同。

此外,如果用==比较值,JavaScript会进行类型转换,这可能导致意外行为(例如undefined == null)。最好始终使用严格比较===(值和类型必须相同),只有在确实知道自己在做什么时才使用类型转换。

一些阅读材料:


更新:

有关于nullundefined的非严格比较(或者一般性的比较)的更多信息,值得查看规范。比较算法在这里被定义了(比较是x == y):

  1. 如果Type(x)和Type(y)相同,则
    (...)
  2. 如果xnull并且yundefined,则返回true
  3. 如果xundefined并且ynull,则返回true
  4. (...)

(...)


5
"undefined == null" 也会返回 true,因此最好使用 "x === null"。 - fforw

4

如果x为false、NaN、''(空字符串)、undefined(使用严格比较运算符===)或0(零),则结果可能会有所不同。

请参阅Felix Kling的回答,了解类型比较的优秀概述。


未定义类型强制转换为 null,因此对于 undefined,(x == null) 为 true,尽管 (x === null) 不是。 - justkt
是的,@justkt 发现得很好,我会更新答案以供将来参考。 - Wesley Murch

3

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为null”。
当X是布尔值时,(!x)在X为false时为真,但(x == null)不为真。对于数字来说,0和NaN被认为是假值,因此非X为真值。 在这里查看示例,包括使用类型转换的相等性==和严格相等性===之间的差异。

1

!x测试假值。对于任何因素可以传播为false的值,这将为真。这将对false0等的排列组合为真。

x == null是不同的,因为var x = 0不会是null...但会是false。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接