【问题标题】:Javascript falsy values (null, undefined, false, empty string: "" or '' and 0) and comparison(==) operator [duplicate]Javascript 虚假值(null、undefined、false、空字符串:“”或 '' 和 0)和比较(==)运算符 [重复]
【发布时间】:2014-01-18 15:39:37
【问题描述】:

当我在if 语句中使用任何值(nullundefinedfalse''0)时,它总是被评估为谬误(false) .此外,在 if 语句中对这些值的否定((nullundefinedfalse''0)始终评估为重言式(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),我将不胜感激。

【问题讨论】:

  • 由于这里没有人提到它,所以双感叹号(!!,即不是不是)可能很有用。 if (!!myvariable) 如果 myvariable 的值不是使其为 false 的任何值,则返回 true。这并不总是与检查 if (myvariable == true) 相同。

标签: javascript null undefined


【解决方案1】:

一个常见的误解

"...如果双等于 (==) 运算符仅检查/比较值而不是类型..."

这是一个错误的假设,尽管人们经常重复它。实际上,== 确实检查类型,而且实际上比 === 比较更关注类型。

Abstract Equality Comparison Algorithm

== 比较不会进行简单的 toBoolean 转换。相反,它会通过一个有点复杂的递归算法,在检查类型之后,如果它们不匹配,它会尝试将操作数强制为相同的类型。

它执行的类型强制非常特定于操作数的类型。对于不同的类型对,可以发生不同的强制序列。通常(但并非总是)它最终最终将操作数强制转换为 number 类型。


为什么!ing 操作数会改变事情

当您使用 ! 手动强制两个操作数时,您现在正在执行一个简单的 toBoolean 转换,导致类型匹配,这避免了算法的类型强制部分,使其行为本质上比如Strict Equality Comparison Algorithm

因此,当类型不匹配时,预测 == 比较结果的唯一方法是了解抽象算法。


别忘了NaN

仅供参考,还有一个“虚假”值需要考虑,NaN。无论如何,它的== 比较总是false。即使与另一个 NaN 值进行比较,它也会是 false

【讨论】:

    【解决方案2】:

    undefined: 表示声明了变量但没有赋值

    null:null的值已经赋值,表示没有值

    false''0 我想你大概可以弄清楚这些是什么意思。

    【讨论】:

      【解决方案3】:

      NULL 不同于 false(NULL 是 object 类型,false 是 boolean 类型),null 不同于 0(0 是整数类型),null 也不同于 ''('' 是细绳)。但它们都是虚假值。这 !运算符否定一个布尔值。如果 !用于虚假值,它会将虚假值转换为布尔类型的对象。

      【讨论】:

      • 不是“布尔类型的对象”,但通常是的。
      • 感谢您的回复。我的问题是 - 如果所有这些值都是假值(null,undefined,false,'',0)并且双等于(==)运算符比较值(不是类型)那么它们为什么返回 - null == false // 返回 false null == undefined // 返回真 !null == !false //返回真
      • @SurajKumar,这是因为 == 运算符在执行实际比较之前将两个操作数转换为相同的类型。
      猜你喜欢
      • 2017-09-18
      • 1970-01-01
      • 2016-07-04
      • 2015-07-25
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      相关资源
      最近更新 更多