JavaScript比较运算符 != 和 !== 的区别

72

是的,我找不到那些旧帖子,谢谢。 - manny
如果你想启用类型强制转换(而你从不想这样做),那么使用!=。否则,请使用!== - Šime Vidas
2
说实话,这并不是一个完全的重复,因为它是关于!=和!==的区别,而不是==和===。所以如果有人特别想知道!=和!==的区别,那么这会有所帮助。但他们怎么知道它与==和===具有相同的行为呢? - CrazyVideoGamer
3个回答

67

关于它们的区别的易懂解释

!=======/!=进行更严格的比较。前者不仅检查被比较的对象是否是相同的类型,还会检查值是否匹配。

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

(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 是值,得出true或false。进行此类比较的方式如下:

  1. 如果 Type(x) 与 Type(y) 不同,则返回 false。
  2. 如果 Type(x) 是 Undefined,则返回 true。
  3. 如果 Type(x) 是 Null,则返回 true。
  4. 如果 Type(x) 是 Number,则

    a. 如果 x 是 NaN,则返回 false。

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

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

    d. 如果 x 是 +0 而 y 是 0,则返回 true。

    e. 如果 x 是 0 而 y 是 +0,则返回 true。

    f. 返回 false。

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

  6. 如果 Type(x) 是 Boolean,则如果 x 和 y 都是 true 或都是 false,则返回 true;否则,返回 false。
  7. 如果 x 和 y 引用同一对象,则返回 true。否则,返回 false。注意:此算法在对待有符号零和 NaNs 方面与 SameValue 算法 (9.12) 不同。

11.9.3 抽象相等比较算法

比较 x == y,其中 x 和 y 是值,得出 true 或 false。进行此类比较的方式如下:

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

    a. 如果 Type(x) 是 Undefined,则返回 true。

    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 is0, return true.
    
    5. If x is0 and y is +0, return true.
    
    6. Return false.
    

    d. 如果Type(x)是字符串,则仅在x和y完全相同(长度相同且相应位置上的字符相同)时返回true。否则,返回false。 e. 如果Type(x)是布尔值,则仅在x和y都为true或者都为false时返回true。否则,返回false。 f. 如果x和y引用同一个对象,则返回true。否则,返回false。

  2. 如果x为null且y为undefined,则返回true。
  3. 如果x为undefined且y为null,则返回true。
  4. 如果Type(x)为数字且Type(y)为字符串,则返回比较结果x == ToNumber(y)。
  5. 如果Type(x)为字符串且Type(y)为数字,则返回比较结果ToNumber(x) == y。
  6. 如果Type(x)为布尔值,则返回比较结果ToNumber(x) == y。
  7. 如果Type(y)为布尔值,则返回比较结果x == ToNumber(y)。
  8. 如果Type(x)为字符串或数字,且Type(y)为对象,则返回比较结果x == ToPrimitive(y)。
  9. 如果Type(x)为对象,且Type(y)为字符串或数字,则返回比较结果ToPrimitive(x) == y。
  10. 返回false

1
感谢您提供这么清晰易懂的解释! - Mark Gavagan

8
区别在于前一种(!=)版本将强制转换两个变量以使其类型相容后再进行比较。因此:
"" == 0    -> true
"" === 0   -> false

另一种版本需要严格的相等性 - 两个值必须是相同类型并具有相同的值。大多数情况下,这实际上是您应该使用的版本。在对象的情况下,严格相等意味着它们实际上是同一个对象。对象之间的比较不执行对象内容的逐个字段比较。更多信息请参见https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators

7

其区别在于 !== 仅在变量类型相同且不相等的情况下返回 true。


这是不正确的。1 !== "1" 也会返回 true。你的意思是:!== 的区别在于如果变量相等但类型不同,它将返回 true。 - murf
1
比较以下两个语句:1 !== "1"(真)和 1 != "1"(假)。 - murf
你不能说“只有真”,因为1 !==“1”和1 !==“2”都是真的。因此,正确的陈述是!== 是真的;当值、类型或两者都不同时。只有当你使用!==将值与自身进行比较时,它才会变成假。即:1 !== 1是假的,因为类型和值都相同。 - Vaisakh Rajagopal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接