大概思路,總共分為兩種類型
- 基本類型:直接用
===判斷 - 引用類型:先判斷構(gòu)造函數(shù)是否相等,再判斷屬性以及屬性值是否相等,深度遍歷此處用到遞歸
注:對(duì)象的屬性順序不知道是否必須一致,此處未考慮
function compare(arg1, arg2) {
if (arg1 === arg2) {
return true; //基本類型的值全等號(hào)就可以判斷
}
if (arg1.constructor !== arg2.constructor) {
return false;//引用類型的值如果構(gòu)造函數(shù)不同則不相等
}
for (var p in arg1) {//遍歷arg1中的屬性
if (arg1.hasOwnProperty(p)) {
if (!arg2.hasOwnProperty(p)) {
return false;//arg2中沒(méi)有該屬性則返回false
}
if (arg1[p] === arg2[p]) {
continue; //有且屬性值相等,則進(jìn)行下一輪判斷
}
if (typeof( arg1[p] ) !== "object") {
return false;//兩個(gè)值不全等也不是引用類型,則不相等
}
if (!compare(arg1[p], arg2[p])) {
return false;//有相同的屬性值且是引用類型則遞歸調(diào)用自身
}
}
}
for (p in arg2) { //反過(guò)來(lái)判斷防止arg1是arg2的子集,保證arg2中的屬性都在arg1中
if (arg2.hasOwnProperty(p) && !arg1.hasOwnProperty(p)) {
return false;
}
}
return true;
};
var a = [1, '2', {a: 1}];
var b = [1, '2', {a: 1}];
var c = {arr: [1, 2, true, undefined], name: 'haha'};
var d = {name: 'haha', arr: [1, 2, true, undefined]};
var e = {name: 'haha', arr: [1, 2, true, undefined], j: 1};
console.log(compare(a, b));//true
console.log(compare(c, d));//true
console.log(compare(d, e));//false