詳解Object.is()與比較操作符===、==

== (或者 !=) 操作在需要的情況下自動進行了類型轉(zhuǎn)換。=== (或 !==)操作不會執(zhí)行任何轉(zhuǎn)換。===在比較值和類型時,可以說比==更快。

[10] ==  10      // 為 true
[10] === 10      // 為 false

'10' ==  10      // 為 true
'10' === 10      // 為 false

 []  ==  0       // 為 true
 []  === 0       // 為 false

 ''  ==  false   // 為 true 但 true == "a" 為false
 ''  === false   // 為 false

而在ES6中,Object.is()類似于===,但在三等號判等的基礎(chǔ)上特別處理了 NaN 、-0 和 +0 ,保證 -0 和 +0 不再相同,但 Object.is(NaN, NaN) 會返回 true。

下面這些情況Object.is()會認為兩個值是相同的:

兩個值都是 undefined
兩個值都是 null
兩個值都是 true 或者都是 false
兩個值是由相同個數(shù)的字符按照相同的順序組成的字符串
兩個值指向同一個對象
兩個值都是數(shù)字并且
都是正零 +0
都是負零 -0
都是 NaN
都是除零和 NaN 外的其它同一個數(shù)字

這種相等性判斷邏輯和傳統(tǒng)的==運算符所用的不同,== 運算符會對它兩邊的操作數(shù)做隱式的類型轉(zhuǎn)換(如果它們是不同類型的值的話),然后才進行相等性比較,(所以才會有類似 "" == false 為 true 的現(xiàn)象),但 Object.is 不會做這種類型轉(zhuǎn)換。

而且,即便嚴格相等運算符 === 不會對操作數(shù)進行類型轉(zhuǎn)換,但它不能區(qū)分兩個不同的數(shù)字 -0 和 +0,還會把兩個 NaN 看成是不相等的。

Object.is('foo', 'foo');     // true
Object.is(window, window);   // true

Object.is('foo', 'bar');     // false
Object.is([], []);           // false

var test = { a: 1 };
Object.is(test, test);       // true

Object.is(null, null);       // true

// 兩個特例,=== 也沒法判斷的情況
Object.is(0, -0);            // false
Object.is(NaN, 0/0);         // true
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 表達式 表達式是由數(shù)字、運算符、數(shù)字分組符號(如括號)、自由變量和約束變量等以能求得數(shù)值的有意義排列方法所得的組合...
    劼哥stone閱讀 648評論 0 4
  • 標簽: 我的筆記 ---學(xué)習(xí)資料:http://javascript.ruanyifeng.com/ 1. 導(dǎo)論 ...
    暗夜的怒吼閱讀 950評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • 焉逢12閱讀 290評論 0 0
  • 一晃三十多歲了,有人說我太老實,有人說我太傻了。老實與傻之間的區(qū)別,我至始至終也沒有弄明白。 親戚朋友之間,我總是...
    皇信超閱讀 316評論 0 0

友情鏈接更多精彩內(nèi)容