1. 程式人生 > >JS中==、===和Object.is()的區別

JS中==、===和Object.is()的區別

首先,先粗略瞭解一下這三個玩意兒:

  1. ==:等同,比較運算子,兩邊值型別不同的時候,先進行型別轉換,再比較;
  2. ===:恆等,嚴格比較運算子,不做型別轉換,型別不同就是不等;
  3. Object.is()ES6新增的用來比較兩個值是否嚴格相等的方法,與===的行為基本一致。

下面分別詳細說明一下這三個玩意兒:

  1. 先說===,這個比較簡單,只需要利用下面的規則來判斷兩個值是否恆等就行了:

    1. 如果型別不同,就不相等
    2. 如果兩個都是數值,並且是同一個值,那麼相等
      1. 值得注意的是,如果兩個值中至少一個是NaN,那麼不相等(判斷一個值是否是NaN,可以用isNaN()Object.is()來判斷)。
    3. 如果兩個都是字串,每個位置的字元都一樣,那麼相等;否則不相等
    4. 如果兩個值都是同樣的Boolean值,那麼相等
    5. 如果兩個值都引用同一個物件或函式,那麼相等,即兩個物件的實體地址也必須保持一致;否則不相等
    6. 如果兩個值都是null,或者都是undefined,那麼相等
  2. 再說Object.is(),其行為與===基本一致,不過有兩處不同:

    1. +0不等於-0
    2. NaN等於自身。

    舉個栗子☺:

    +0 === -0 //true
    NaN === NaN // false
    
    Object.is(+0, -0) // false
    Object.is(NaN, NaN) // true
  3. 最後說==,根據以下規則來進行判斷:

    1. 如果兩個值型別相同,進行===比較。
    2. 如果兩個值型別不同,那麼他們可能相等。根據下面規則進行型別轉換,然後再比較:
      1. 如果一個是null、一個是undefined,那麼相等
      2. 如果一個是字串,一個是數值,把字串轉換成數值再進行比較。
      3. 如果任一值是true,把它轉換成 1 再比較;如果任一值是false,把它轉換成 0 再比較。
      4. 如果一個是物件,另一個是數值或字串,把物件轉換成基礎型別的值再比較。物件轉換成基礎型別,利用它的toString或者valueOf方法。
        1. JS的核心內建類,會嘗試valueOf先於toString;但有一個是例外——DateDate利用的是toString轉換。
        2. JS核心的物件,令說(比較麻煩,我也不大懂)。
      5. 任何其他組合,都不相等

    舉個栗子☺:
    "1" == true:型別不等,true 會先轉換成數值 1 ,現在變成 “1” == 1 ,再把 “1” 轉換成 1 ,比較 1 == 1 , 相等。

舉個全域性的栗子☺:

  1. =:賦值運算子。
  2. ==:等於。
  3. ===:嚴格等於。
  4. Object.is():加強版嚴格等於。

例:

var a = 3; 
var b = "3"; 

a==b;    // true
a===b;   // false,因為*a*,*b*的型別不一樣 
Object.is( a, b );  //false,因為*a*,*b*的型別不一樣