JavaScript:if(!x)`和if(x == null)`有什么区别?
if (!x)
和if (x == null)
之间的区别是什么? 也就是说,他们的结果何时会不同?
!x
将返回true
为每一个“falsy”值(空字符串, 0
, null
, false
, undefined
, NaN
),而x == null
只会返回true
,如果x
为 null
(编辑:或明显undefined
(见下文))。
尝试x = 0
,有一个区别。
你可以说那个NOT运算符!
将值转换为其相反的布尔等值。 这与实际比较两个值不同。
另外,如果你用==
比较值,JavaScript会进行类型转换,这会导致意外的行为(如undefined == null
)。 最好始终使用严格的比较===
(值和类型必须相同),并且只有在您确实知道自己在做什么的情况下才能使用类型转换。
有些东西要读:
更新:
有关null
和undefined
(或通常的比较)的非严格比较的更多信息,值得看看规范。 比较算法在那里定义(比较是x == y
):
(......)
(......)
如果x为假,NaN,''(空字符串),undefined(使用严格比较运算符===)或0(零),结果可能不同。
请参阅Felix Kling的答案,了解类型比较的优秀摘要。
说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 is null”的情况下显示。
当X是布尔值时,当X为假但(x == null)
不会时, (!x)
将为真。 对于数字0和NaN被认为是错误的值,所以不是X是真的。
在行动中看到它,包括==
(使用类型转换的平等)和===
(严格相等)之间的区别。
上一篇: JavaScript: What is the difference between `if (!x)` and `if (x == null)`?
下一篇: Every Object is a function and every function is Object