Javascript比较运算符!= vs!==

man*_*nny 31 javascript

可能重复:
Javascript === vs ==:我使用哪个"相等"运算符是否重要?
JavaScript中==和===之间的区别

我有两个要比较的变量.

结果不应该相等,我需要使用哪种条件!=和!==?

因为当我使用两个操作符时它工作正常,但我需要确切地知道有什么区别.

Fil*_*efp 35

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

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

使用==将使得可以进行隐式转换,请参阅以下示例.

(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
Run Code Online (Sandbox Code Playgroud)

标准说什么?

11.9.6严格的平等比较

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

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

    一个.如果x是NaN,则返回false.

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

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

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

    即 如果x是0且y是+0,则返回true.

    F.返回false.

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

  6. 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true; 否则,返回false.
  7. 如果x和y引用同一个对象,则返回true.否则,返回false.注意该算法在处理带符号的零和NaN时与SameValue算法(9.12)不同.

11.9.3抽象等式比较算法

比较x == y,其中x和y是值,产生真或假.这样的比较如下进行:

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

    一个.如果Type(x)是Undefined,则返回t rue.

    湾 如果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.
    
    Run Code Online (Sandbox Code Playgroud)

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

    即 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true.否则,返回false.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)是布尔值,则返回比较结果ToNumber(x)== y.
  7. 如果Type(y)是布尔值,则返回比较结果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. 返回false


Aln*_*tak 7

不同之处在于,在比较之前,前一个!=版本将强制两个变量兼容.因此:

"" == 0    -> true
"" === 0   -> false
Run Code Online (Sandbox Code Playgroud)

另一个版本需要严格相等 - 两个值必须属于同一类型且具有相同的值.大多数情况下,这是你应该实际使用的那个.

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

有关更多信息,请参阅https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators.


bjo*_*rnd 7

不同之处在于 !== 仅当变量具有相同类型且不相等时才返回 true。