JavaScript相等運(yùn)算符的九條規(guī)則示例詳解
簡介
Java的等號有=,==,===三個(gè)運(yùn)算符雖然都讀成“等于”,但概念是不一樣的,=指的是賦值,在這篇文章中我們不會進(jìn)行更多的介紹;==稱為相等運(yùn)算符,比較的是兩個(gè)操作數(shù)值是否相等;===稱為嚴(yán)格相等運(yùn)算符,比較的是兩個(gè)操作數(shù)是否是“同一個(gè)值”。
針對相等運(yùn)算符==和===,有兩個(gè)對應(yīng)的!=和!==運(yùn)算符,這兩個(gè)不相等運(yùn)算符的運(yùn)算結(jié)果是==和===運(yùn)算結(jié)果的相反值。
嚴(yán)格相等運(yùn)算符
嚴(yán)格相等運(yùn)算符在對操作數(shù)進(jìn)對比運(yùn)算時(shí),是不進(jìn)行類型轉(zhuǎn)換的。對比規(guī)則如下:
1. 操作數(shù)類型不同
對比結(jié)果是false
1 === "1" // false true === "true" // false undefined === true //false 1 === true //false
2.同一類原始類型值
如果兩個(gè)值都是原始類型值(數(shù)字、字符串、布爾值),值相同就返回true,值不同就返回false。
對于原始類型值,要注意的是,0和-0是相等的;如果兩個(gè)值是字符串,需要它們在16位編碼的相同位置上有相同的值才是相等。如果是不同的16位編碼序列,就算有相同的內(nèi)容,相同的長度,結(jié)果也是不相等。
'1' === '0' //false 1 === 0x1 // true
3.同是對象
如果兩個(gè)值是對象(數(shù)組、函數(shù)、對象、Symbol),對于兩個(gè)對象比較的是引用,如果引用指向的是不同的對象,則結(jié)果是不相等。
{} === {} // false [] === [] // false (function () {} === function () {}) // false var v1 = {}; var v2 = v1; //v2和v1指向同一個(gè)引用地址 v1 === v2 // true // 沒有參數(shù)的情況 let s1 = Symbol(); let s2 = Symbol(); s1 === s2 // false // 有參數(shù)的情況 let s1 = Symbol('foo'); let s2 = Symbol('foo'); let s3 = s1; s1 === s2 // false s1 === s2 // true
4. null和undefined
如果兩個(gè)值都是null或者都是undefined,結(jié)果是true
null === null //true undefined === undefined //true
5.NaN
如果兩個(gè)值都是NaN,結(jié)果是false
NAN === NAN //false
NaN和任何數(shù)字都不相等,包括它自身
相等運(yùn)算符
1. 值的類型相同
應(yīng)用嚴(yán)格相等運(yùn)算符轉(zhuǎn)換規(guī)則的值類型相同規(guī)則(除:操作數(shù)類型不同)。
2.不同原始類型值
如果是不同原始類型值(數(shù)字、字符串、布爾值)進(jìn)行比較,將非數(shù)字類型轉(zhuǎn)換成數(shù)字,再進(jìn)行比較。
0 == undefined //false // 等同于 0 == Number(undefined) // 等同于0 == NAN 0 == null //false // 等同于 0 == Number(null) 1 == true // true // 等同于 1 == Number(true) 'true' == true // false // 等同于 Number('true') == Number(true) // 等同于 NaN === 1 '' == 0 // true // 等同于 Number('') == 0 // 等同于 0 == 0 '1' == true // true // 等同于 Number('1') == Number(true) // 等同于 1 == 1 '\n 123 \t' == 123 // true // 因?yàn)樽址D(zhuǎn)為數(shù)字時(shí),省略前置和后置的空格
3. 對象和原始類型值
如果其中一個(gè)操作數(shù)是對象,另外一個(gè)是原始類型值(數(shù)字、字符串、布爾值),按如下規(guī)則轉(zhuǎn):
- 將對象轉(zhuǎn)換成原始類型值
- 轉(zhuǎn)換后的原始類型值與另一個(gè)操作數(shù)的類型一樣,使用值類型相同的規(guī)則
- 如果不一樣,將非數(shù)字類型轉(zhuǎn)換成數(shù)字再進(jìn)行比較。
例1:對象對比數(shù)字
[1] == 1 //true
解析:
a. [1]先轉(zhuǎn)換成原始值"1";
b. 轉(zhuǎn)換后與右邊的操作數(shù)1類型不一樣,將"1"轉(zhuǎn)換成1;
c. 1 == 1 結(jié)果是true
例2:對象對比字符串
[1] == "1"
解析:
a. [1]先轉(zhuǎn)換成原始值"1";
b. 轉(zhuǎn)換后與右邊的操作數(shù)"1"類型一樣,"1"=="1",結(jié)果是true;
例3:對象對比布爾值
[1] == true
解析:
a. [1]先轉(zhuǎn)換成原始值"1";
b. 轉(zhuǎn)換后與右邊的操作數(shù)true類型不一樣,將右邊的操作數(shù)true轉(zhuǎn)換成1;
c. 1 == 1結(jié)果是true
4. null和undefined
如果其中一個(gè)值是null,另外一個(gè)是undefined,結(jié)果是相等
null == undefined
對象轉(zhuǎn)換為原始類型規(guī)則
比較操作符的操作數(shù)可能是任意類型,然而只有數(shù)字和字符串才能真正執(zhí)行比較操作,因此那些不是數(shù)字和字符串的類型都將進(jìn)行類型轉(zhuǎn)換。轉(zhuǎn)換的規(guī)則如下:
- 如果對象類型是Date,會調(diào)用該對象的toString();
- 其他情況下,如果valueOf()返回的是原始類型,會調(diào)用對象的valueOf();
- 其他情況下(如果valueOf()不存在或沒有返回原始類型),會調(diào)用toString()方法,大部分情況下是用的這種轉(zhuǎn)換。
- 如果沒有toString()方法,則拋出一個(gè)類型異常錯(cuò)誤
上面的規(guī)則只是應(yīng)用于+、==、!=中涉及到的對象轉(zhuǎn)為原始類型的轉(zhuǎn)換規(guī)則,如果是> ,< 等其他運(yùn)算符涉及的轉(zhuǎn)換,轉(zhuǎn)換規(guī)則中除去日期對象的特殊情況,其他是一樣的,也就是說規(guī)則是下面這樣的:
- 其他情況下,如果valueOf()返回的是原始類型,會調(diào)用對象的valueOf();
- 其他情況下(如果valueOf()不存在或沒有返回原始類型),會調(diào)用toString()方法,大部分情況下是用的這種轉(zhuǎn)換。
- 如果沒有toString()方法,則拋出一個(gè)類型異常錯(cuò)誤
總結(jié)
嚴(yán)格相等運(yùn)算符的比較是不對操作數(shù)進(jìn)行類型轉(zhuǎn)換的,只要操作數(shù)類型不一致,返回就是false;對于操作數(shù)都是原始類型,值相等就返回true,反之返回fase;對于對象,對比的是引用指向的地址,地址是同一個(gè),就返回false,反之返回true;另外介紹了幾個(gè)特殊的操作數(shù)的對比,undefined、null、NaN,其中null和undefined是嚴(yán)格相等的,而NaN和任何類型的操作數(shù)都不會相等包括它自己。
相等運(yùn)算符是會對操作數(shù)進(jìn)行類型轉(zhuǎn)換的,如果操作數(shù)的類型相同,則按嚴(yán)格相等運(yùn)算符的規(guī)則。如操作數(shù)是不同的原始值類型,則都轉(zhuǎn)換成數(shù)字再進(jìn)行比較;如果是原始值類型和對象的比較,則對象先轉(zhuǎn)換成原始類型值再對比,再比較時(shí)如果是相同類型就比較值,如果還是不同,都轉(zhuǎn)換成數(shù)字再進(jìn)行比較;null和undefined是相等的
+、==、!=在進(jìn)行運(yùn)算時(shí)如果涉及到對象類型轉(zhuǎn)為原始值時(shí),轉(zhuǎn)換規(guī)則和其他的運(yùn)算符是不一樣的。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。
相關(guān)文章
ThreeJS從創(chuàng)建場景到使用功能實(shí)例詳解
threejs是一個(gè)用于在瀏覽器中繪制3D圖像的JS庫,它是基于webgl實(shí)現(xiàn)了,包括了webgl1和webgl2的渲染引擎,下面這篇文章主要給大家介紹了關(guān)于ThreeJS從創(chuàng)建場景到使用功能的相關(guān)資料,需要的朋友可以參考下2022-08-08JavaScript實(shí)現(xiàn)中秋博餅游戲的示例代碼
中秋博餅習(xí)俗源于福建廈門,盛行于漳州的龍海、泉州的安海和金門縣等地。博餅的游戲規(guī)則簡單公平,既充滿競爭懸念,又富于生活情趣,本文將用JavaScript實(shí)現(xiàn)這一經(jīng)典游戲,感興趣的可以了解一下2022-09-09jquery 實(shí)現(xiàn)輸入郵箱時(shí)自動(dòng)補(bǔ)全下拉提示功能
大家在做Web項(xiàng)目,都會有注冊登錄模塊,如果是郵箱注冊,想要在輸入@后觸發(fā)下拉框顯示各個(gè)郵箱的功能。下面介紹一款jQuery實(shí)現(xiàn)輸入郵箱的時(shí)候,可自動(dòng)補(bǔ)全郵箱地址,也可稱為是“輸入提示”的功能,比如輸入aaa時(shí),自動(dòng)變成aaa@163.com,有效提升網(wǎng)頁的人性化體驗(yàn)2015-10-10淺析使用BootStrap TreeView插件實(shí)現(xiàn)靈活配置快遞模板
這篇文章主要介紹了使用bootstrap-treeview插件實(shí)現(xiàn)靈活配置快遞模板的相關(guān)資料,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11js實(shí)現(xiàn)頁面導(dǎo)航層級指示效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)頁面導(dǎo)航層級指示效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08等待指定時(shí)間后自動(dòng)跳轉(zhuǎn)或關(guān)閉當(dāng)前頁面的js代碼
本文為大家詳細(xì)介紹下如何通過js實(shí)現(xiàn)等待指定時(shí)間后自動(dòng)跳轉(zhuǎn)或關(guān)閉當(dāng)前頁面的腳步代碼,感興趣的朋友可以參考下哈,希望對大家有所幫助2013-07-07javascript彈出一個(gè)層并增加一個(gè)覆蓋層
彈出一個(gè)層的js代碼,比較不錯(cuò)2008-10-10