这个问题在这里已经有了答案:
JavaScript: What is the difference between `if (!x)` and `if (x == null)`?
(6 个回答)
8年前关闭。
当我在 null
中使用任何值( undefined
、 false
、 ''
、 0
、 if
)时陈述,它总是被评估为谬误(false
)。此外,null
语句中这些值的否定(( undefined
, false
, ''
, 0
, if
)总是被评估为重言式( true
)。
if(null){
}else{
}
if(undefined){
}else{
}
if(false){
}else{
}
if(''){
}else{
}
if(0){
}else{
}
在上述所有情况下,
if
语句被评估为 false
& else
语句执行。但是,当我将这些谬误值与
==
进行比较时运算符,它不返回 true
总是。令人惊讶的是,它总是返回 true
当我比较这些值的否定时的值。如果 double equalto (
==
) 运算符检查/比较值而不是严格地检查类型,那么为什么:null == false // returns false
null == 0 // returns false
null == '' // returns false
但,
!null == !false // returns true
!null == !0 // returns true
!false == !undefined // returns true
和,
null == undefined // returns true
false == 0 // returns true
如果有人能澄清这些值之间的行为或关系,我将不胜感激(
null
、undefined
、false
、''
、0
)。
最佳答案
一个常见的误解
"...If double equalto (
==
) operator only checks/compares for values & not for types..."
这是一个不正确的假设,尽管人们经常重复它。实际上,
==
确实检查类型,实际上比 ===
更关注类型比较确实。见 Abstract Equality Comparison Algorithm .
一个
==
比较不会进行简单的 toBoolean 转换。相反,它会通过一个有点复杂的递归算法,在检查类型之后,如果它们不匹配,它会尝试将操作数强制为相同的类型。它执行的类型强制非常特定于操作数的类型。对于不同的类型对,可以发生不同的强制序列。通常(但不总是)它最终最终将操作数强制为
number
类型。为什么
!
改变操作数当您使用
!
手动强制两个操作数时,您现在正在执行一个简单的 toBoolean 转换,导致类型匹配,这避免了算法的类型强制部分,使其行为本质上类似于 Strict Equality Comparison Algorithm .因此,预测
==
的结果的唯一方法是类型不匹配时的比较是为了理解抽象算法。不要忘记
NaN
仅供引用,还有一个“虚假”值需要考虑,
NaN
.其==
比较将始终为 false
,无论如何。即使与另一个 NaN
进行比较值,它将是 false
.
关于Javascript 虚假值(null、undefined、false、空字符串 : "" or '' and 0) and comparison(==) operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21206207/