js-“比较2个基本数据类型的变量是否相等”及“浅比较”
2017-07-19 本文已影响1197人
webCoder
js基本数据类型比较.png我们在js中校验2个基本数据类型的变量是否相等时,一般就直接用a === b来做判断了,但是这种写法其实是不严谨的。具体为什么呢,看看下面的几个表达式:
意外的表达式
- +0 === -0
js中打印为true,我们期望是false
- NaN === NaN
js中打印为false,我们期望是true
如何解决呢?
解决+0 === -0 为true,我们可以通过:
1/(+0)结果为Infinity,
1/(-0)结果为-Infinity
而Infinity === -Infinity为false。
所以当a === b时,且1 / x === 1 / y,则可以排除+0和-0的问题。
解决 NaN === NaN为false,我们可以通过:
NaN和自身不相等的特性来解决,即:
a !==b && a !== a && b !== b时,确定这两个数是NaN。
下面就是比较2个基本数据类型的变量是否相等的方法:
function is(x, y) {
if (x === y) {
//排除 +0 == -0
return x !== 0 || y !== 0 || 1 / x === 1 / y;
} else {
return x !== x && y !== y;
}
}
利用上面的比较基本数据类型的方法,我们可以很容易的写出任意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;
}