【问题标题】:Why === instead of == for undefined [duplicate]为什么 === 而不是 == 未定义 [重复]
【发布时间】:2014-11-14 21:42:15
【问题描述】:

一些消息来源表明,有两种规范的方法可以检查变量是否未定义:

foo === undefined
typeof foo === 'undefined'

但是谁能解释一下,为什么要使用 === 而不是 ==

编辑:问题不在于 === 与 ==。它是关于使用带有“未定义”的正确运算符。 === 和 == 之间的区别是显而易见的。但问题是在检查值是否未定义时,哪个运算符更正确。

【问题讨论】:

  • === 比较类型 first 然后值。 == 比较值并可以转换值以使类型匹配。
  • == 执行类型转换以尝试得出肯定的结果。尤其是typeof,它只返回一个字符串,不需要转换类型,为什么要支付开销?
  • null == undefined,但null !== undefined

标签: javascript typeof


【解决方案1】:

当然很简单。你基于你想要的行为(如下)

null == undefined // true
undefined === null // false
typeof undefined // 'undefined'
typeof null // 'object'

【讨论】:

  • undefined == null // true 对吗?
  • 是的,JS 中的所有相等运算符都是关联的@elclanrs(注意b >= a 并不意味着a <= b:P
  • @elclanrs 啊,我明白你在指出什么。 megawac,第二行有一个 typeo。
【解决方案2】:

=== 是严格的比较。 === 不仅比较值,还比较数据类型,例如:

"2" == 2 is true
"2" === 2 is false

【讨论】:

    【解决方案3】:

    看起来问题不在于===== 运算符之间的区别,而在于在什么情况下应该使用=== undefined 比较以及何时使用typeof == 'unefined'。嗯..

    有两种方法可以检查未定义的值。

    第一种方式是使用严格比较运算符===undefined原语进行比较:

    var a;
    a === undefined; // true
    

    上述比较将按预期工作,仅当变量已声明但具有未定义值时。 请注意,如果从未声明过变量,则不能使用a === undefined 比较,因为它会引发引用错误:

    a === undefined // ReferenceError: a is not defined 
    

    这就是为什么在这种情况下typeof 比较是防弹的:

    typeof a == 'undefined' // true
    

    这在两种情况下都可以正常工作:如果变量从未被赋值,并且它的值实际上是undefined

    还有一个例子。如果我们要检查是否存在/可能丢失的prop 属性:

    someObj.prop === undefined // ReferenceError: a is not defined
    

    但是

    typeof someObj.prop == 'undefined' // true
    

    【讨论】:

    • 只要定义了someObj,然后尝试检查someObj.prop === undefined是否不会抛出引用错误,它只会返回truefalse
    • 你是绝对正确的。问题不只是关于 === vs ==。它是关于使用带有“未定义”的正确运算符。很遗憾它有这么多的缺点,因为人们没有考虑问题就急于回答。
    【解决方案4】:

    === 运算符测试类型和值。在您的代码中始终如一地使用它有助于防止一些微妙和烦人的错误,通常是一个非常好的主意。

    "5" == 5    // True, even though one is a string and the other a number
    "5" === 5   // False because the two variables are of different type
    

    虽然与特殊的未定义属性相比,这可能不是绝对必要的,但它肯定不会造成伤害,并且在代码中的任何地方都使用 === 比在除了这个角落之外的任何地方都使用 === 更好案子。一致性很好。

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 2017-05-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多