当我在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
)。< / p>
答案 0 :(得分:15)
“...如果双等于(
==
)运算符仅检查/比较值而不是类型...”
这是一个不正确的假设,尽管它经常被人们重复。实际上,==
会检查类型,实际上比===
比较更关注类型。
请参阅 Abstract Equality Comparison Algorithm 。
==
比较不会进行简单的 toBoolean 转换。相反,它通过一个有点复杂的递归算法,在检查类型后,如果它们不匹配,则尝试将操作数强制转换为相同的类型。
它执行的类型强制非常特定于操作数的类型。对于不同类型对,可以发生不同的强制序列。通常(但并非总是)它最终会将操作数强制转换为number
类型。
!
操作数改变了事情当您使用!
手动强制两个操作数时,您现在正在进行简单的 toBoolean 转换,从而导致类型匹配,从而避免算法的类型强制部分,使其成为表现基本上像 Strict Equality Comparison Algorithm 。
因此,当类型不匹配时,预测==
比较结果的唯一方法是理解抽象算法。
NaN
而且仅供参考,还有一个值得考虑的“假”值NaN
。无论如何,它的==
比较始终为false
。即使与另一个NaN
值进行比较,它也会是false
。
答案 1 :(得分:1)
undefined
:表示已声明变量但未指定值
null
:已分配null值,这意味着它没有值
false
,''
和0
我认为您可以解决这些问题。
答案 2 :(得分:1)
NULL与false不同(NULL是object类型,false是boolean类型),null不同于0(0是整数类型),null也不同于''(''是类型为串)。但他们都是虚假的价值观。的!运算符否定布尔值。如果!在falsy值上使用,它导致将falsy值转换为boolean类型的对象。