下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第JavaScript判斷兩個(gè)值相等的方法詳解目錄前言非嚴(yán)格相等嚴(yán)格相等同值零同值總結(jié)
前言
在JavaScript中如何判斷兩個(gè)值相等,這個(gè)問題看起來非常簡(jiǎn)單,但并非如此,在JavaScript中存在4種不同的相等邏輯,如果你不知道他們的區(qū)別,或者認(rèn)為判斷相等非常簡(jiǎn)單,那么本文非常適合你閱讀。
ECMAScript是JavaScript的語言規(guī)范,在ECMAScript規(guī)范中存在四種相等算法,如下圖所示:
上圖中四種算法對(duì)應(yīng)的中文名字如下,大部分前端應(yīng)該熟悉嚴(yán)格相等和非嚴(yán)格相等,但對(duì)于同值零和同值卻不熟悉,下面我們分別介紹這四種算法。
同值同值零非嚴(yán)格相等嚴(yán)格相等
非嚴(yán)格相等
非嚴(yán)格相等使用兩個(gè)等號(hào),也就是我們熟悉的雙等,非嚴(yán)格相等表示語義相等,不要求類型一樣,非嚴(yán)格相等在比較前會(huì)先將比較參數(shù)類型轉(zhuǎn)換為一致,再進(jìn)行比較,代碼示例如下:
1==1;//true
1=='1';//true類型不同,不影響比較結(jié)果
非嚴(yán)格相等有非常復(fù)雜的轉(zhuǎn)換規(guī)則,非常難以記憶,社區(qū)中有人將上面的規(guī)則總結(jié)成了圖片,一圖勝千言,如下圖所示:
為了方便記住非嚴(yán)格相等的的轉(zhuǎn)換邏輯,作者將非對(duì)象值,可以總結(jié)為如下三條規(guī)則:
Undefined只和Null相等和Number比較時(shí),另一個(gè)值會(huì)自動(dòng)轉(zhuǎn)換為Number和Boolean比較時(shí),另一個(gè)值會(huì)轉(zhuǎn)換為Number
如果值為對(duì)象,會(huì)使用內(nèi)部的ToPrimitive轉(zhuǎn)換,可以通過自定義Symbol.toPrimitive改變返回值,需要注意的是在相等的判斷中Symbol.toPrimitive接受的hint參數(shù)都是default。
constobj={
[Symbol.toPrimitive](hint){
console.log(hint);
if(hint=='number'){
return1;
if(hint=='string'){
return'yan';
returntrue;
console.log(obj==1);//obj返回true
console.log(obj=='1');//obj返回true
console.log(obj==true);//obj返回true
非嚴(yán)格相等并非帶來了很多便利,通過隱式的自動(dòng)轉(zhuǎn)換,簡(jiǎn)化了部分場(chǎng)景的工作,比如Number和String的自動(dòng)轉(zhuǎn)換,簡(jiǎn)化了前端從表單,url參數(shù)中獲取值的比較問題,但自動(dòng)轉(zhuǎn)換帶來的問題比便利還多。
隱式轉(zhuǎn)換的規(guī)則,大部分情況下難以駕馭,現(xiàn)在主流的觀點(diǎn)已經(jīng)不建議使用,作者建議只在判斷undefined和null的場(chǎng)景下可以使用非嚴(yán)格相等。
嚴(yán)格相等
嚴(yán)格相等是另一種比較算法,其和非嚴(yán)格想等的區(qū)別是不會(huì)進(jìn)行類型轉(zhuǎn)換,類型不一致時(shí)直接返回false,嚴(yán)格相等對(duì)應(yīng)===操作符,因?yàn)槭褂萌齻€(gè)等號(hào),也被稱作三等或者全等,嚴(yán)格相等示例如下:
1===1;//true
1==='1';//false類型不同,影響比較結(jié)果
不同類型值判斷規(guī)則如下,和前面的非嚴(yán)格相等對(duì)比,嚴(yán)格相等更符合直覺。
嚴(yán)格相等解決了非嚴(yán)格相等中隱式轉(zhuǎn)換帶來的問題,但也丟失了隱式轉(zhuǎn)換帶來的便利,對(duì)于類型可能不一致的情況下,比如從表單中獲取的值都是字符串,保險(xiǎn)的做法是,在比較前手動(dòng)類型轉(zhuǎn)換,代碼示例如下:
1===Number('1');//true手動(dòng)類型轉(zhuǎn)換,類型防御
嚴(yán)格相等幾乎總是正確的,但也有例外情況,比如NaN和正負(fù)0的問題。
Number類型有個(gè)特殊的值NaN,用來表示計(jì)算錯(cuò)誤的情概況,比較常見是非Number類型和Number類型計(jì)算時(shí),會(huì)得到NaN值,代碼示例如下所示,這是從表單和接口請(qǐng)求獲取數(shù)據(jù)時(shí)很容易出現(xiàn)的問題。
consta=0/0;//NaN
constb='a'/1;
constc=undefined+1;//NaN
在嚴(yán)格相等中,NaN是不等于自己的,NaN是(x!==x)成立的唯一情況,在某些場(chǎng)景下其實(shí)是希望能夠判斷NaN的,可以使用isNaN進(jìn)行判斷,ECMAScript2015引入了新的Number.isNaN,和isNaN的區(qū)別是不會(huì)對(duì)傳入的參數(shù)做類型轉(zhuǎn)換,建議使用語義更清晰的Number.isNaN,但是要注意兼容性問題,判斷NaN代碼示例如下:
NaN===NaN;//false
isNaN(NaN);//true
Number.isNaN(NaN);//true
isNaN('aaa');//true自動(dòng)轉(zhuǎn)換類型'aaa'轉(zhuǎn)換為Number為NaN
Number.isNaN('aaa');//false不進(jìn)行轉(zhuǎn)換,類型不為Number,直接返回false
嚴(yán)格相等另一個(gè)例外情況是,無法區(qū)分+0和-0,代碼示例如下,在一些數(shù)學(xué)計(jì)算場(chǎng)景中是要區(qū)分語義的。
+0===-0;//true
JavaScript中很多系統(tǒng)函數(shù)都使用嚴(yán)格相等,比如數(shù)組的indexOf,lastIndexOf和switch-case等,需要注意,這些對(duì)于NaN無法返回正確結(jié)果,代碼示例如下:
[NaN].indexOf(NaN);//-1數(shù)組中其實(shí)存在NaN
[NaN].lastIndexOf(NaN);//-1
同值零
同值零是另一種相等算法,名字來源于規(guī)范的直譯,規(guī)范中叫做SameValueZero,同值零和嚴(yán)格相等功能一樣,除了處理NaN的方式,同值零認(rèn)為NaN和NaN相等,這在判斷NaN是否在集合中的語義下是非常合理的。
ECMAScript2016引入的includes使用此算法,此外Map的鍵去重和Set的值去重,使用此算法,代碼示例如下:
[NaN].incdudes(NaN);//true注意和indexOf的區(qū)別,incdudes的語義更合理
newSet([NaN,NaN]);//[NaN]set中只會(huì)有個(gè)一個(gè)NaN,如果NaN!==NaN的話,應(yīng)該是[NaN,NaN]
newMap([
[NaN,1],
[NaN,2],
]);//{NaN=2}如果NaN!==NaN的話,應(yīng)該是{NaN=1,NaN=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 雨水沉淀池設(shè)計(jì)標(biāo)準(zhǔn)
- 校園隊(duì)員制度規(guī)范
- 水泵管理制度規(guī)范
- 培訓(xùn)內(nèi)訓(xùn)師制度規(guī)范
- 單位制度建設(shè)不規(guī)范
- 規(guī)范特殊車輛管理制度
- 房建安全制度規(guī)范
- 施工現(xiàn)場(chǎng)氣候適應(yīng)性方案
- 現(xiàn)場(chǎng)管理制度及規(guī)范
- 規(guī)范招商運(yùn)營(yíng)制度
- 醫(yī)院醫(yī)療保險(xiǎn)費(fèi)用審核制度
- 村衛(wèi)生室醫(yī)療質(zhì)量相關(guān)管理制度
- 非遺傳承人激勵(lì)機(jī)制探索-深度研究
- 中小學(xué)校園中匹克球推廣策略與實(shí)踐研究
- 2024年世界職業(yè)院校技能大賽高職組“體育活動(dòng)設(shè)計(jì)與實(shí)施組”賽項(xiàng)考試題庫(kù)(含答案)
- 高中地理選擇性必修一(湘教版)期末檢測(cè)卷02(原卷版)
- 滬教版九年級(jí)化學(xué)上冊(cè)(上海版)全套講義
- 三角函數(shù)圖像變化課件
- 《內(nèi)存條知識(shí)培訓(xùn)》課件
- 人教版(2024)七年級(jí)地理期末復(fù)習(xí)必背考點(diǎn)提綱
- 廣東省深圳市南山區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期數(shù)學(xué)期末教學(xué)質(zhì)量監(jiān)測(cè)試卷
評(píng)論
0/150
提交評(píng)論