js中判斷兩個(gè)參數(shù)是否相等的函數(shù)

大概思路,總共分為兩種類型

  • 基本類型:直接用===判斷
  • 引用類型:先判斷構(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容