1、為什么要判斷?

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