1、為什么要判斷?
可能有些同學(xué)看到這個標(biāo)題就會產(chǎn)生疑惑,為什么我們要判斷JavaScript中的兩個變量是否相等,JavaScript不是已經(jīng)提供了雙等號“==”以及三等號“===”給我們使用了嗎?
其實(shí),JavaScript雖然給我們提供了相等運(yùn)算符,但是還是存在一些缺陷,這些缺陷不符合我們的思維習(xí)慣,有可能在使用的時候得到一些意外的結(jié)果。為了避免這種情況的出現(xiàn),我們需要自己函數(shù)來實(shí)現(xiàn)JavaScript變量之間的對比。
2、JavaScript等號運(yùn)算符存在哪些缺陷?
2.1 0與-0
在JavaScript中:
0 === 0
//true
+0 === -0
//true
相等運(yùn)算符認(rèn)為+0和-0是相等的,但是我們應(yīng)當(dāng)認(rèn)為兩者是不等的,具體原因源碼中給出了一個鏈接:Harmony egal proposal.
2.2 null和undefined
在JavaScript中:
null == undefined
//true
null === undefined
//false
我們應(yīng)當(dāng)認(rèn)為null不等于undefined,所以在比較null和undefined時,應(yīng)當(dāng)返回false。
2.3 NaN
前文有說過,NaN是一個特殊的值,它是JavaScript中唯一一個自身不等于自身的值。
NaN == NaN
//false
NaN === NaN
//false
但是我們在對比兩個NaN時,我們應(yīng)當(dāng)認(rèn)為它們是相等的。
2.4 數(shù)組之間的對比
由于在JavaScript中,數(shù)組是一個對象,所以如果兩個變量不是引用的同一個數(shù)組的話,即使兩個數(shù)組一模一樣也不會返回true。
var a = [];
//undefined
var b = [];
//undefined
a=== b
//false
a==b
//false
但是我們應(yīng)當(dāng)認(rèn)為,兩個元素位置、順序以及值相同的數(shù)組是相等的。
2.5 對象之間的對比
凡是涉及到對象的變量,只要不是引用同一個對象,都會被認(rèn)為不相等。我們需要做出一些改變,兩個完全一致的對象應(yīng)當(dāng)被認(rèn)為是相等的。
var a = {};
//undefined
var b = {};
//undefined
a == b
//false
a === b
//false
這種情況在所有JavaScript內(nèi)置對象中也適用,比如我們應(yīng)當(dāng)認(rèn)為兩個一樣的RegExp對象是相等的。
2.6 基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型之間的對比
在JavaScript中,數(shù)值2和Number對象2是不嚴(yán)格相等的:
2 == new Number(2);
//true
2 === new Number(2);
//false
但是我們在對比2和new Number(2)時應(yīng)當(dāng)認(rèn)為兩者相等。
3 underscore的實(shí)現(xiàn)方法
我們實(shí)現(xiàn)的方法當(dāng)然還是依賴于JavaScript相等運(yùn)算符的,只不過針對特例需要有特定的處理。我們在比較之前,首先應(yīng)該做的就是處理特殊情況。
underscore的代碼中,沒有直接將邏輯寫在_.isEqual方法中,而是定義了兩個私有方法:eq和deepEq。在GitHub用戶@hanzichi的repo中,我們可以看到1.8.3版本的underscore中并沒有deepEq方法,為什么后來添加了呢?這是因為underscore的作者把一些特例的處理提取了出來,放到了eq方法中,而更加復(fù)雜的對象之間的對比被放到了deepEq中(同時使得deepEq方法更加便于遞歸調(diào)用)。這樣的做法使得代碼邏輯更加鮮明,方法的功能也更加單一明確,維護(hù)代碼更加簡潔快速。
eq方法的源代碼:
var eq = function (a, b, aStack, bStack) { // Identical objects are equal. `0 === -0`, but they aren't identical. // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). //除了0 === -0這個特例之外,其余所有a === b的例子都代表它們相等。 //應(yīng)當(dāng)判斷0 !== -0,但是JavaScript中0 === -0。 //下面這行代碼就是為了解決這個問題。 //當(dāng)a !== 0或者1/a === 1/b時返回true,一旦a === 0并且1/a !== 1/b就返回false。 //而a === 0且1/a !== 1/b就代表a,b有一個為0,有一個為-0。 if (a === b) return a !== 0 || 1 / a === 1 / b; //一旦a、b不嚴(yán)格相等,就進(jìn)入后續(xù)檢測。 //a == b成立但是a === b不成立的例子中需要排除null和undefined,其余例子需要后續(xù)判斷。 // `null` or `undefined` only equal to itself (strict comparison). //一旦a或者b中有一個為null就代表另一個為undefined,這種情況可以直接排除。 if (a == null || b == null) return false; // `NaN`s are equivalent, but non-reflexive. //自身不等于自身的情況,一旦a,b都為NaN,則可以返回true。 if (a !== a) return b !== b; // Exhaust primitive checks //如果a,b都不為JavaScript對象,那么經(jīng)過以上監(jiān)測之后還不嚴(yán)格相等的話就可以直接斷定a不等于b。 var type = typeof a; if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; //如果a,b是JavaScript對象,還需要做后續(xù)深入的判斷。 return deepEq(a, b, aStack, bStack); };
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
當(dāng)前名稱:判斷JavaScript中的兩個變量是否相等的操作符-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://aaarwkj.com/article10/cdpgdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、ChatGPT、電子商務(wù)、用戶體驗、網(wǎng)站收錄、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容