ES6+ Object.is()
1. 前言
在 ES5 中判斷兩個(gè)值是否相等基本都是使用 ==
或 ===
來判斷,ES6 提供了 Object.is()
方法來判斷兩個(gè)值是否相同,這個(gè)方法彌補(bǔ)了使用等號(hào)方式判斷所存在的問題。
2. 方法詳情
2.1 基本語法
Object.is()
會(huì)接收兩個(gè)需要判斷的參數(shù),最后返回一個(gè)布爾值,如果相同則返回 true
否則返回 false
。
語法使用:
Object.is(value1, value2);
參數(shù)解釋:
參數(shù) | 描述 |
---|---|
value1 | 第一個(gè)需要比較的值 |
value2 | 第二個(gè)需要比較的值 |
2.2 基本使用
下面通過一些案例來說明一下 Object.is()
的使用:
Object.is('imooc', 'imooc'); // true
Object.is('imooc', 'mooc'); // false
Object.is(window, window); // true
Object.is([], []); // false
var foo = { a: 1 };
var bar = { a: 1 };
var obj = foo;
Object.is(foo, foo); // true
Object.is(foo, bar); // false
Object.is(foo, obj); // true
Object.is(null, null); // true
// 特例
Object.is(0, -0); // false
Object.is(0, +0); // true
Object.is(-0, -0); // true
Object.is(NaN, 0/0); // true
上面的代碼中,需要注意的是,在對(duì)象判斷時(shí),如果判斷的數(shù)據(jù)是引用類型,即使兩個(gè)對(duì)象值是一樣的,但是它們也會(huì)返回 false
,這是由于對(duì)象的存儲(chǔ)方式?jīng)Q定的。在判斷 0 和 - 0 的時(shí)候,二者不是同一個(gè)值,所以返回 false
。
3. 對(duì)比等號(hào) (=)
判斷值相等,一般有兩種 ==
(雙等) 和 ===
(三等),他們之間有所不同。在值對(duì)比的過程中,類型轉(zhuǎn)換在中間起到重要的作用,在對(duì)比過程中必須考慮到,值是否被類型轉(zhuǎn)換了。
3.1 == 運(yùn)算符
==
是一個(gè)非嚴(yán)格相等的對(duì)比運(yùn)算符,它只會(huì)對(duì)比兩邊的操作數(shù)是否相等,相等則會(huì)返回 true
。如果對(duì)比的操作數(shù)類型不同,則會(huì)自動(dòng)將值進(jìn)行隱式轉(zhuǎn)換為一種常見的類型,然后才進(jìn)行相等性比較。我們來看如下的實(shí)例:
0 == -0 // true
0 == '0' // true
0 == false // true
0 == '' // true
"" == false // true
null == undefined // true
1 == '1' // true
true == 'true' // false
NaN == 'NaN' // false
NaN == NaN // false
{"name": "imooc"} == {"name": "imooc"} // false
let a = {"name": "imooc"}
let b = a
console.log(a == b) // true
上面的代碼中,列出了 ==
判斷大部分場(chǎng)景,但是這樣的判斷方式存在嚴(yán)謹(jǐn)性,在類型不同的時(shí)候會(huì)做類型轉(zhuǎn)換,這樣不利于判斷兩個(gè)值是否真實(shí)相等。我們總結(jié)以下幾點(diǎn):
NaN
不等于包含它自身在內(nèi)的任何值;- 0 和 - 0 相等;和 false 也是相等的,和空字符串也是相等的;
null
等于null
和undefined
;- 操作的值可以被自動(dòng)轉(zhuǎn)換為
String
、Boolean
、Number
三種類型; String
類型的比較會(huì)區(qū)分操作值大小寫;- 兩個(gè)操作值如果引用同一個(gè)對(duì)象,返回
true
,否則false
; - 6 個(gè)虛值 (
null
,undefined
, ‘’ ,0
,NaN
,false
)。
3.2 === 運(yùn)算符
===
是嚴(yán)格相等的,被稱作全等操作符,和 ==
很相似,區(qū)別在于 ===
不執(zhí)行隱式類型轉(zhuǎn)換。只有當(dāng)兩個(gè)操作值的值與類型都相等的前提下,才會(huì)返回 true
。但是一些操作值的判斷還是會(huì)有問題:
+0 === -0 // true
true === true // true
null === null // true
NaN === NaN // false, NaN永遠(yuǎn)不等于NaN
1 === '1' // false, 值類型不同:數(shù)值和字符串
true === 'true' // false
null === undefined // false
'Imooc' === 'imooc' // false, 嚴(yán)格區(qū)分大小寫
null
上面的代碼中,存在兩個(gè)問題,+0 和 - 0 是全等的,雖然它們沒有進(jìn)行隱式轉(zhuǎn)化,但是它們是帶符號(hào)的,我們其實(shí)也不希望它們是相等的。NaN
不等于任何值,包括它自己,這樣我們就無法判斷兩個(gè) NaN 值相等了。根據(jù)上面的例子,我們可以總結(jié)以下幾點(diǎn):
NaN
不等于包含它在內(nèi)的任何值;- 0 等于 - 0,+0 和 -0 也相等;
null
等于null
,但不等于undefined
;String
嚴(yán)格區(qū)分大小寫;- 兩個(gè)操作值如果引用同一個(gè)對(duì)象,返回
true
,否則false
。
3.3 Object.is()
Object.is()
被稱為同值相等的比較,在兩個(gè)值進(jìn)行比較時(shí)用到了很多規(guī)則,比如上面 ===
在判斷帶符號(hào)的 0 時(shí)返回的都是 true
,NaN
和任何值都不相等,但 Object.is()
給出了截然相反的結(jié)果:
Object.is(0, -0); // false
Object.is(NaN, NaN); // true
下面我們來看下,Object.is()
都有哪些規(guī)則:
- 當(dāng)操作值都沒有被定義時(shí),這時(shí)它們的值是
undefined
,通過Object.is()
判斷的結(jié)果為true
。
let a
let b
Object.is(a,b) // true
Object.is()
也是嚴(yán)格區(qū)分大小寫的。
Object.is('Imooc', 'Imooc') // true
Object.is('Imooc', 'imooc') // false
- 操作值的類型必須相同,無論是什么值,只要類型不一樣就會(huì)返回
false
。
Object.is(null, 'null') // false
Object.is(undefined, 'undefined') // false
- 判斷引用類型的值時(shí),引用類型的地址相同時(shí),則相等,與
==
和===
判斷的結(jié)果是一樣的。
let a = {"name": "imooc"}
let b = a
Object.is(a, b) // true
Object.is({"name": "imooc"}, {"name": "imooc"}) // false
Object.is(window, window) // true, 只有一個(gè)window全局變量
- 操作數(shù)是 0、+0、-0 的比較,0 和 +0 是相等的,因?yàn)檎?hào)可以省略,但是 0 和 -0 是不相等的,這樣就和
===
判斷的結(jié)果不一樣了。
Object.is(0, +0) // true
Object.is(0, -0) // false
- 當(dāng)兩個(gè)操作值是
NaN
時(shí),使用Object.is()
返回的結(jié)果是true
這個(gè)和===
返回的結(jié)果不一樣,如果計(jì)算的結(jié)果是NaN
的話,返回的結(jié)果也是true
。
Object.is(NaN, NaN) // true
Object.is(NaN, 0/0) // true
4. 小結(jié)
本節(jié)講解了判斷兩個(gè)值是否相同的方法 Object.is()
,這個(gè)方法彌補(bǔ)了使用等號(hào)(=)判斷的不足,更加準(zhǔn)確地判斷兩個(gè)值是否相同。同時(shí)處理 0 和 - 0 以及 NaN
值的判斷,所以在開發(fā)中,盡量使用 Object.is()
方法去判斷兩個(gè)相同的值,會(huì)更加準(zhǔn)確明了。