JavaScript 中的 `==` 和 `===` 操作符詳解
1. == 操作符:寬松相等
==
是 JavaScript 中的寬松相等操作符。當(dāng)使用 ==
進(jìn)行比較時(shí),如果操作數(shù)的類型不相同,JavaScript 會(huì)嘗試進(jìn)行 類型轉(zhuǎn)換,然后再進(jìn)行比較。
1.1 原始類型與原始類型的比較
1.1.1 布爾值與數(shù)值的比較
如果其中一個(gè)操作數(shù)是布爾值,JavaScript 會(huì)將布爾值轉(zhuǎn)換為數(shù)值進(jìn)行比較,true
轉(zhuǎn)換為 1
,false
轉(zhuǎn)換為 0
。
console.log(true == 1); // true console.log(false == 0); // true
1.1.2 字符串與數(shù)值的比較
如果一個(gè)操作數(shù)是字符串,另一個(gè)是數(shù)值,JavaScript 會(huì)嘗試將字符串轉(zhuǎn)換為數(shù)值再進(jìn)行比較。如果字符串能夠被轉(zhuǎn)換為合法的數(shù)值,則繼續(xù)比較,否則字符串將會(huì)被轉(zhuǎn)化為NaN,結(jié)果為 false
。
console.log('55' == 55); // true console.log('44' == 55); // false console.log('55asfa' == 55); // false, 因?yàn)?'55asfa' 轉(zhuǎn)換為 NaN
當(dāng)字符串無法轉(zhuǎn)換為有效數(shù)值時(shí),NaN
與任何值的比較都為 false
。
1.1.3 null 與 undefined 的比較
在 JavaScript 中,null
和 undefined
之間使用 ==
比較時(shí)會(huì)被認(rèn)為相等。
console.log(null == undefined); // true
undefined
表示變量已經(jīng)聲明但尚未賦值,而 null
表示變量沒有值或值為空。
1.1.4 NaN 的比較
NaN
(Not a Number)與任何值的比較結(jié)果都是 false
,包括它自己。
console.log(NaN == NaN); // false
1.2 原始類型與引用類型的比較
當(dāng)一個(gè)操作數(shù)是對(duì)象(引用類型),另一個(gè)是原始類型(如數(shù)字、字符串或布爾值)時(shí),JavaScript 會(huì)嘗試將對(duì)象轉(zhuǎn)換為原始類型,然后再進(jìn)行比較。轉(zhuǎn)換通常通過調(diào)用對(duì)象的 valueOf()
或 toString()
方法來實(shí)現(xiàn)。
1.2.1 對(duì)象與數(shù)字的比較
如果一個(gè)對(duì)象與數(shù)字比較,JavaScript 會(huì)嘗試將對(duì)象轉(zhuǎn)換為原始值(通常為數(shù)字)。首先,它會(huì)調(diào)用對(duì)象的 valueOf()
方法,如果 valueOf()
返回一個(gè)原始值,則使用該值進(jìn)行比較。如果 valueOf()
沒有返回原始值,JavaScript 會(huì)調(diào)用 toString()
方法,并嘗試將返回值轉(zhuǎn)換為數(shù)字。
const obj = { name: 'a' }; console.log(obj == 1); // false, 因?yàn)?obj.toString() 返回 "[object Object]",轉(zhuǎn)換為 NaN
1.3 引用類型與引用類型的比較
對(duì)象之間的比較是基于它們的 內(nèi)存引用地址。如果兩個(gè)對(duì)象引用的是同一個(gè)內(nèi)存地址,則 ==
返回 true
,否則返回 false
,即使它們的內(nèi)容相同。
const obj1 = { name: 'b' }; const obj2 = { name: 'b' }; const obj3 = obj1; console.log(obj1 == obj2); // false, 不同的內(nèi)存地址 console.log(obj1 == obj3); // true, 相同的內(nèi)存地址
2. === 操作符:嚴(yán)格相等
===
是 JavaScript 中的 嚴(yán)格相等 操作符,它不會(huì)進(jìn)行任何類型轉(zhuǎn)換。如果兩個(gè)值的類型不同,比較結(jié)果直接為 false
。在使用 ===
時(shí),兩個(gè)值必須 類型和內(nèi)容 都相等,才會(huì)返回 true
。
console.log(true === 1); // false, 因?yàn)椴紶栔蹬c數(shù)值類型不同 console.log('55' === 55); // false, 因?yàn)樽址c數(shù)值類型不同 console.log(null === undefined); // false, 類型不同
引用類型的比較
與 ==
一樣,===
在比較對(duì)象時(shí)也基于內(nèi)存地址。
const obj1 = { name: 'b' }; const obj2 = obj1; console.log(obj1 === obj2); // true, 引用的是同一個(gè)對(duì)象 console.log({} === {}); // false, 不同的內(nèi)存地址
3. == 與 === 的區(qū)別
==
:會(huì)進(jìn)行類型轉(zhuǎn)換(如將字符串轉(zhuǎn)換為數(shù)字),然后再進(jìn)行比較。===
:不會(huì)進(jìn)行任何類型轉(zhuǎn)換,要求類型和值都相等。
舉例說明:
console.log(1 == '1'); // true, 因?yàn)?'1' 被轉(zhuǎn)換為數(shù)值 1 console.log(1 === '1'); // false, 因?yàn)轭愋筒煌?
4. 總結(jié)
- 使用
==
時(shí),JavaScript 會(huì)進(jìn)行類型轉(zhuǎn)換,然后比較值是否相等。因此,==
是一種較為寬松的比較方式。 - 使用
===
時(shí),JavaScript 不會(huì)進(jìn)行類型轉(zhuǎn)換,要求類型和值都必須相等,因此===
更加嚴(yán)格和精確。
在開發(fā)中,推薦 優(yōu)先使用 ===
進(jìn)行比較,因?yàn)樗軌虮苊庖驗(yàn)殡[式類型轉(zhuǎn)換帶來的潛在問題,使代碼更健壯和可讀。
以上就是JavaScript 中的 `==` 和 `===` 操作符詳解的詳細(xì)內(nèi)容,更多關(guān)于JavaScript操作符==和===的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Javascript 一些需要注意的細(xì)節(jié)(必看篇)
下面小編就為大家?guī)硪黄狫avascript 一些需要注意的細(xì)節(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07如何讓一個(gè)層關(guān)閉之后,就算刷新頁面了也不顯示。除非關(guān)閉頁面再次打開
這個(gè)功能,一般可用于廣告的顯示,當(dāng)關(guān)閉后,就不顯示,除非重新關(guān)閉打開,增加用戶體驗(yàn)2008-09-09javascript實(shí)現(xiàn)簡單下拉菜單效果
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)簡單下拉菜單效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一2022-08-08Javascript中this關(guān)鍵字的一些小知識(shí)
這篇文章主要介紹了Javascript中this關(guān)鍵字的一些小知識(shí),本文講解了this的隱性綁定、var that = this兩部份內(nèi)容,需要的朋友可以參考下2015-03-03JavaScript Cookie顯示用戶上次訪問的時(shí)間和次數(shù)
用cookies記錄用戶的訪問時(shí)間與次數(shù),然后再次訪問時(shí),在讀取。2009-12-12JS Html轉(zhuǎn)義和反轉(zhuǎn)義(html編碼和解碼)的實(shí)現(xiàn)與使用方法總結(jié)
這篇文章主要介紹了JS Html轉(zhuǎn)義和反轉(zhuǎn)義(html編碼和解碼)的實(shí)現(xiàn)與使用方法,結(jié)合實(shí)例形式總結(jié)分析了JS Html轉(zhuǎn)義和反轉(zhuǎn)義、html編碼和解碼相關(guān)封裝類定義與具體使用技巧,需要的朋友可以參考下2020-03-03