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

时间:2011-12-23 13:09:14

标签: javascript

  

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

我有两个要比较的变量。

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

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

3 个答案:

答案 0 :(得分:27)

关于其差异的人类可读文本

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

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

(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.   
  3. 如果Type(x)为Undefined,则返回true。
  4.   
  5. 如果Type(x)为Null,则返回true。
  6.   
  7. 如果Type(x)是Number,那么

         

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

         

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

         

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

         

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

         

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

         

    F。返回false。

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

  10.   
  11. 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true;否则,返回false。
  12.   
  13. 如果x和y引用同一个对象,则返回true。否则,返回false。注意此算法与SameValue算法不同(9.12)   处理有符号的零和NaN。
  14.   

  

11.9.3抽象等式比较算法

     

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

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

         

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

         

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

         

    ℃。如果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。

         

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

  2.   
  3. 如果x为null且y未定义,则返回true。
  4.   
  5. 如果x未定义且y为null,则返回true。
  6.   
  7. 如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y)。
  8.   
  9. 如果Type(x)为String且Type(y)为Number,则返回比较结果ToNumber(x)== y。
  10.   
  11. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
  12.   
  13. 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
  14.   
  15. 如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
  16.   
  17. 如果Type(x)是Object而Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y。
  18.   
  19. 返回false
  20.   

答案 1 :(得分:6)

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

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

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

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

有关详情,请参阅https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators

答案 2 :(得分:4)

区别很简单:!==仅当变量具有相同类型且相等时返回。