我們在js中校驗2個基本數(shù)據(jù)類型的變量是否相等時与斤,一般就直接用a === b來做判斷了肪康,但是這種寫法其實是不嚴謹?shù)募远瘛>唧w為什么呢撩穿,看看下面的幾個表達式:
意外的表達式
- +0 === -0
js中打印為true,我們期望是false
- NaN === NaN
js中打印為false谒撼,我們期望是true
如何解決呢食寡?
解決+0 === -0 為true,我們可以通過:
1/(+0)結(jié)果為Infinity廓潜,
1/(-0)結(jié)果為-Infinity
而Infinity === -Infinity為false抵皱。
所以當a === b時,且1 / x === 1 / y辩蛋,則可以排除+0和-0的問題呻畸。
解決 NaN === NaN為false,我們可以通過:
NaN和自身不相等的特性來解決悼院,即:
a !==b && a !== a && b !== b時伤为,確定這兩個數(shù)是NaN。
下面就是比較2個基本數(shù)據(jù)類型的變量是否相等的方法:
function is(x, y) {
if (x === y) {
//排除 +0 == -0
return x !== 0 || y !== 0 || 1 / x === 1 / y;
} else {
return x !== x && y !== y;
}
}
利用上面的比較基本數(shù)據(jù)類型的方法据途,我們可以很容易的寫出任意2個對象的淺比較
function shallowEqual(objA, objB) {
if (is(objA, objB)) {
return true;
}
if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
return false;
}
var keysA = Object.keys(objA);
var keysB = Object.keys(objB);
if (keysA.length !== keysB.length) {
return false;
}
for (var i = 0; i < keysA.length; i++) {
if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
return false;
}
}
return true;
}