JS中==、===和Object.is()的區別
阿新 • • 發佈:2019-01-02
首先,先粗略瞭解一下這三個玩意兒:
==
:等同,比較運算子,兩邊值型別不同的時候,先進行型別轉換,再比較;===
:恆等,嚴格比較運算子,不做型別轉換,型別不同就是不等;Object.is()
是ES6新增的用來比較兩個值是否嚴格相等的方法,與===
的行為基本一致。
下面分別詳細說明一下這三個玩意兒:
先說
===
,這個比較簡單,只需要利用下面的規則來判斷兩個值是否恆等就行了:- 如果型別不同,就不相等
- 如果兩個都是數值,並且是同一個值,那麼相等;
- 值得注意的是,如果兩個值中至少一個是NaN,那麼不相等(判斷一個值是否是NaN,可以用
isNaN()
或Object.is()
來判斷)。
- 值得注意的是,如果兩個值中至少一個是NaN,那麼不相等(判斷一個值是否是NaN,可以用
- 如果兩個都是字串,每個位置的字元都一樣,那麼相等;否則不相等。
- 如果兩個值都是同樣的Boolean值,那麼相等。
- 如果兩個值都引用同一個物件或函式,那麼相等,即兩個物件的實體地址也必須保持一致;否則不相等。
- 如果兩個值都是null,或者都是undefined,那麼相等。
再說
Object.is()
,其行為與===
基本一致,不過有兩處不同:- +0不等於-0。
- NaN等於自身。
舉個栗子☺:
+0 === -0 //true NaN === NaN // false Object.is(+0, -0) // false Object.is(NaN, NaN) // true
最後說
==
,根據以下規則來進行判斷:- 如果兩個值型別相同,進行
===
比較。 - 如果兩個值型別不同,那麼他們可能相等。根據下面規則進行型別轉換,然後再比較:
- 如果一個是null、一個是undefined,那麼相等。
- 如果一個是字串,一個是數值,把字串轉換成數值再進行比較。
- 如果任一值是true,把它轉換成 1 再比較;如果任一值是false,把它轉換成 0 再比較。
- 如果一個是物件,另一個是數值或字串,把物件轉換成基礎型別的值再比較。物件轉換成基礎型別,利用它的
toString
或者valueOf
方法。
- JS的核心內建類,會嘗試
valueOf
先於toString
;但有一個是例外——Date,Date利用的是toString
轉換。 - 非JS核心的物件,令說(比較麻煩,我也不大懂)。
- JS的核心內建類,會嘗試
- 任何其他組合,都不相等。
舉個栗子☺:
"1" == true
:型別不等,true 會先轉換成數值 1 ,現在變成 “1” == 1 ,再把 “1” 轉換成 1 ,比較 1 == 1 , 相等。- 如果兩個值型別相同,進行
舉個全域性的栗子☺:
=
:賦值運算子。==
:等於。===
:嚴格等於。Object.is()
:加強版嚴格等於。
例:
var a = 3;
var b = "3";
a==b; // true
a===b; // false,因為*a*,*b*的型別不一樣
Object.is( a, b ); //false,因為*a*,*b*的型別不一樣