【问题标题】:Javascript Comparison Operators != vs !== [duplicate]Javascript比较运算符!= vs!== [重复]
【发布时间】:2012-01-26 20:07:51
【问题描述】:

可能重复:
Javascript === vs == : Does it matter which “equal” operator I use?
Difference between == and === in JavaScript

我有两个变量要比较。

结果不应该相等,在什么情况下我需要使用 != 和 !== ?

因为当我同时使用这两个运算符时它工作正常,但我需要确切知道有什么区别。

【问题讨论】:

  • 是的,我找不到那些旧帖子,谢谢。
  • 如果你想启用类型强制(你永远不想),当使用!=。否则,使用!==
  • 老实说,这并不是真正的重复,因为这是特定于 != 和 !==,而不是 == 和 ===。因此,如果有人特别想知道 != 和 !== 的区别,那么这会有所帮助。他们怎么知道它与 == 和 === 具有相同的行为?

标签: javascript


【解决方案1】:

关于它们差异的人类可读文本

使用!===== 将比==/!= 进行更严格的比较。前者将检查被比较的对象是否属于同一类型,以及值是否匹配。

使用== 可以进行隐式转换,请参见以下示例。

(0 ==  '0') // true
(0 === '0') // false

('' ==  0 ) // true, the string will implicitly be converted to an integer
('' === 0 ) // false, no implicit cast is being made

标准是怎么说的?

11.9.6 严格等式比较

算法 比较 x === y,其中 x 和 y 是值,产生真或假。这样的比较 执行如下:

  1. 如果 Type(x) 与 Type(y) 不同,则返回 false。
  2. 如果 Type(x) 未定义,则返回 true。
  3. 如果 Type(x) 为 Null,则返回 true。
  4. 如果 Type(x) 是数字,那么

    一个。如果 x 为 NaN,则返回 false。

    b.如果 y 为 NaN,则返回 false。

    c。如果 x 与 y 的数值相同,则返回 true。

    d。如果 x 为 +0 且 y 为 0,则返回 true。

    e。如果 x 为 0 且 y 为 +0,则返回 true。

    f。返回 false。

  5. 如果 Type(x) 是字符串,那么如果 x 和 y 是完全相同的字符序列(相同的长度和相同的字符在 对应位置);否则,返回 false。

  6. 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真;否则,返回 false。
  7. 如果 x 和 y 引用同一个对象,则返回 true。否则,返回假。注意 该算法不同于 SameValue 算法 (9.12) 处理有符号零和 NaN。

11.9.3 抽象等式比较算法

比较 x == y,其中 x 和 y 是值,产生 true 或 错误的。这样的比较是这样进行的:

  1. 如果 Type(x) 与 Type(y) 相同,那么

    一个。如果 Type(x) 未定义,则返回 t rue。

    b.如果 Type(x) 为 Null,则返回 true。

    c。如果 Type(x) 是 Number,那么

    1. If x is NaN, return false.
    
    2. If y is NaN, return false.
    
    3. If x is the same Number value as y, return true.
    
    4. If x is +0 and y is 0, return true.
    
    5. If x is 0 and y is +0, return true.
    
    6. Return false.
    

    d。如果 Type(x) 是 String,如果 x 和 y 正好是,则返回 true 相同的字符序列(相同的长度和相同的字符 对应位置)。否则,返回 false。

    e。如果 Type(x) 是布尔值,如果 x 和 y 都为真,则返回真,或者 两者都是假的。否则,返回假。 F。如果 x 和 y 引用同一个对象,则返回 true。否则,返回 false。

  2. 如果 x 为 null 而 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为 null,则返回 true。
  4. 如果 Type(x) 是 Number 且 Type(y) 是 String,则返回比较结果 x == ToNumber(y)。
  5. 如果 Type(x) 是 String,Type(y) 是 Number,则返回比较结果 ToNumber(x) == y。
  6. 如果 Type(x) 是 Boolean,则返回比较结果 ToNumber(x) == y。
  7. 如果 Type(y) 是 Boolean,则返回比较结果 x == ToNumber(y)。
  8. 如果 Type(x) 是 String 或 Number 且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。
  9. 如果 Type(x) 是 Object 并且 Type(y) 是 String 或 Number,则返回 ToPrimitive(x) == y 的比较结果。
  10. 返回假

【讨论】:

    【解决方案2】:

    不同之处在于,前者 (!=) 版本会在比较之前强制两个变量类型兼容。因此:

    "" == 0    -> true
    "" === 0   -> false
    

    另一个版本要求 strict 相等 - 这两个值必须都是相同类型且具有相同值。大多数情况下,这是您应该实际使用的。

    在对象的情况下,严格相等意味着它们实际上是同一个对象。对象之间的比较不会对对象的内容进行逐个字段的比较。

    请参阅https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators 了解更多信息。

    【讨论】:

      【解决方案3】:

      不同的是,!== 仅在变量具有相同类型且不相等时才返回 true。

      【讨论】:

      • 这是不正确的。 1 !== "1" 也返回 true。您的意思是:不同之处在于 !== 如果变量相等但类型不同,则返回 true。
      • 比较以下两种说法:1 !== "1"(真)和1 != "1"(假)。
      • 你不能说 'true only',因为 1 !== "1" 和 1 !== "2" 都是真的。所以正确的陈述是 !== 是真的;当任何一个值、类型或两者都不同时。仅当您使用 !== 将值与自身进行比较时,它才会变为假。即: 1 !== 1 为假,因为类型和值都相同。
      猜你喜欢
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多