大概思路,總共分為兩種類型
- 基本類型:直接用
===
判斷 - 引用類型:先判斷構造函數(shù)是否相等,再判斷屬性以及屬性值是否相等,深度遍歷此處用到遞歸
注:對象的屬性順序不知道是否必須一致,此處未考慮
function compare(arg1, arg2) {
if (arg1 === arg2) {
return true; //基本類型的值全等號就可以判斷
}
if (arg1.constructor !== arg2.constructor) {
return false;//引用類型的值如果構造函數(shù)不同則不相等
}
for (var p in arg1) {//遍歷arg1中的屬性
if (arg1.hasOwnProperty(p)) {
if (!arg2.hasOwnProperty(p)) {
return false;//arg2中沒有該屬性則返回false
}
if (arg1[p] === arg2[p]) {
continue; //有且屬性值相等,則進行下一輪判斷
}
if (typeof( arg1[p] ) !== "object") {
return false;//兩個值不全等也不是引用類型,則不相等
}
if (!compare(arg1[p], arg2[p])) {
return false;//有相同的屬性值且是引用類型則遞歸調(diào)用自身
}
}
}
for (p in arg2) { //反過來判斷防止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