Javascript假值(null,undefined,false,空字符串:“”或''和0)和比较(==)运算符

时间:2014-01-18 15:39:38

标签: javascript null undefined

当我在null语句中使用任何一个值(undefinedfalse''0if)时,它总是被评估为谬误(false)。此外,null语句中对这些值({undefinedfalse''0if)的否定总是被评估为言式(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

我感谢任何人澄清这些价值观之间的行为或关系(nullundefinedfalse''0)。< / p>

3 个答案:

答案 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类型的对象。