对象的深度比较
基本数据类型的值:基于 === 比较即可;
函数比较:都转换为字符串再比较;
对象比较:
正则和日期:都转换为字符串再比较;
普通对象/数组对象等:
先比较私有属性的个数,再分别遍历每个属性,看属性值是否一致
function _is(val1, val2) {
const type1 = val1 === null ? 'null' : typeof val1; //首先获取数据类型
const type2 = val2 === null ? 'null' : typeof val2;
//如果是函数,比较时先用toString()转换为字符串再比较
if (type1 === 'function' && type2 === 'function') {
return val1.toString() === val2.toString();
}
//如果是对象比较,分为正则/日期比较 和 其他对象比较
if (type1 === 'object' && type2 === 'object') {
//正则和日期比较,先用toString()转换为字符串再比较
const ct1 = val1.constructor;
const ct2 = val2.constructor
if ((ct1 === RegExp && ct2 === RegExp) || (ct1 === Date && ct2 === Date))
return val1.toString() === val2.toString();
//其他对象比较,先比较属性个数,再比较属性值
const keys1 = Object.keys(val1);
const keys2 = Object.keys(val2);
if (keys1.length !== keys2.length) return false;
for (let i = 0; i < keys1.length; i++) {
let key1 = keys1[i];
let key2 = keys2[i];
if (key1 !== key2) return false;
let flag = _is(val1[key1], val2[key2]);
if (!flag) return false
}
return true;
}
//其他
return val1 === val2;
}