js中判断两个参数是否相等的函数

大概思路,总共分为两种类型

  • 基本类型:直接用===判断
  • 引用类型:先判断构造函数是否相等,再判断属性以及属性值是否相等,深度遍历此处用到递归
    注:对象的属性顺序不知道是否必须一致,此处未考虑
function compare(arg1, arg2) {
    if (arg1 === arg2) {
        return true; //基本类型的值全等号就可以判断
    }
    if (arg1.constructor !== arg2.constructor) {
        return false;//引用类型的值如果构造函数不同则不相等
    }
    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;//有相同的属性值且是引用类型则递归调用自身
            }
        }
    }

    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

你可能感兴趣的:(js中判断两个参数是否相等的函数)