// 判断两个值是否相等
export default function isEqual(obj1, obj2) {
const obj1Type = checkType(obj1);
const obj2Type = checkType(obj2);
// 首先判断是否类型相同
if (obj1Type !== obj2Type) {
return false;
}
if (obj1Type === "array") { // 注意: 数组需要考虑顺序,如果顺序不同,数组不同
if (obj1.length !== obj2.length) {
return false;
} else { // 注意: 需要考虑多维数组和数组的项是对象类型等
return obj1.every((item,index) => isEqual(item, obj2[index]));
}
}
if (obj1Type === "object") { // 对象本身无序,不需要考虑顺序
const obj1Keys = Object.keys(obj1);
const obj2Keys = Object.keys(obj2);
if (obj1Keys.length !== obj2Keys.length) {
return false;
} else { // 注意:需要考虑对象嵌套情况
const newSetObj2Keys = new Set(obj2Keys)
for (let i in obj1) {
if (obj1.hasOwnProperty(i)) {
if (!newSetObj2Keys.has(i)) return false;
if (!isEqual(obj1[i], obj2[i])) return false;
}
}
return true;
}
}
return Object.is(obj1, obj2);
}
export function checkType(data) {
return Object.prototype.toString.call(data).toLowerCase().slice(8, -1);
}