有哪些判斷相等性的方法
JavaScript現在提供了三種方法來判斷相等性:
- ===,三個等號即嚴格相等
- ==,兩個等號即寬松相等
- Object.is(),ES6中用來判斷相等的方法
判斷相等性的細節
===(嚴格相等)
被比較的兩個數不會進行類型轉換,具體的比較過程如下:
- 不同類型的值:直接返回false
- 同一類型的基本類型的值:比較值是否相同,相同就返回true,不相同就返回false,有一個例外NaN === NaN返回false
- 同一類的復合類型的值:比較它們是否指向同一個對象,是就返回true,否則返回false
例子:
var a = 2, b = '2'
a === b // false
undefined === null // false
NaN === NaN // false
+0 === -0 // true
var f = function(){}
var c = f, d = f;
c === d // true
復制代碼
==(寬松相等)
寬松相等主要是在某些情況下涉及到隱式類型轉換的問題,廢話不說,看一下MDN上面對寬松相等的規則總結:
- 類型相同時,結果和===一樣
- undefined和null互相比較時為true,但是它們和其他類型比較時都為false
- 原始類型A和原始類型B比較時:ToNumber(A) === ToNumber(B)
- 原始類型A和復合類型B比較時:ToNumber(A) == ToPrimitive(B)
那么ToNumber和ToPrimitive這兩個方法內部到底是如何判斷的呢?查看一下ECMA說明
ToNumber
- undefined,返回NaN
- null,返回+0
- boolean,true返回1,false返回+0
- number,直接返回自身
- string,將字符串的內容轉換為數字,轉換失敗則返回NaN。例如"123"這樣的就是返回123,"213a"這樣的返回NaN
- symbol,拋出typeerror錯誤
- object,先調用toPrimitive,再對其結果調用toNumber
ToPrimitive
首先這個方法有兩個參數,input和preferredType,如果preferredType是number的話,大致過程如下:
- 如果input就是原始類型,直接返回其自身
- 調用input.valueOf(),如果結果是原始類型,則返回該結果
- 調用input.toString(),如果結果是原始類型,則返回該結果
- 拋出typeerror錯誤
如果preferredType是string,那么第2步和第3步順序反過來。
如果preferredType沒有傳入的話:
- 如果input是Date類型,則preferredType取string
- 否則,preferredType取number
Object.is
這個方法大致和===一樣,除了以下:
- Object.is(NaN, NaN) 返回true
- Object.is(+0, -0) 返回false
參考
知乎-Javascript 中 == 和 === 區別是什么?
全面解析js中的數據類型與類型轉換
ECMA規范