如何對比JS中兩個對象是否相等

① 方法一:通過JSON.stringify(obj)來判斷兩個對象轉(zhuǎn)后的字符串是否相等

優(yōu)點:用法簡單,對于順序相同的兩個對象可以快速進行比較得到結(jié)果
缺點:這種方法有限制就是當(dāng)兩個對比的對象中key的順序不是完全相同時會比較出錯

② 方法二:

// 對Object擴展一個方法chargeObjectEqual
Object.prototype.chargeObjectEqual = function(obj){
    // 當(dāng)前Object對象
    var propsCurr = Object.getOwnPropertyNames(this);
    // 要比較的另外一個Object對象
    var propsCompare = Object.getOwnPropertyNames(obj);
    if (propsCurr.length != propsCompare.length) {
        return false;
    }
    for (var i = 0,max = propsCurr.length; i < max; i++) {
        var propName = propsCurr[i];
        if (this[propName] !== obj[propName]) {
            return false;
        }
    }
    return true;
}

getOwnPropertyNames該方法可以將Object對象的第一層key獲取到并返回一個由第一層key組成的數(shù)組。

優(yōu)點:相對方法一進行了優(yōu)化枉氮,可以應(yīng)對不同順序的Object進行比較愿题,不用擔(dān)心順序不同而對比出錯
缺點:從方法中可以看到只能獲取到第一層的key組成的數(shù)組述呐,當(dāng)對象是復(fù)合對象時無法進行多層對象的比較

③ 方法三:


    function deepCompare(x, y) {
        var i, l, leftChain, rightChain;

        function compare2Objects(x, y) {
            var p;

            // remember that NaN === NaN returns false
            // and isNaN(undefined) returns true
            if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {
                return true;
            }

            // Compare primitives and functions.     
            // Check if both arguments link to the same object.
            // Especially useful on the step where we compare prototypes
            if (x === y) {
                return true;
            }

            // Works in case when functions are created in constructor.
            // Comparing dates is a common scenario. Another built-ins?
            // We can even handle functions passed across iframes
            if ((typeof x === 'function' && typeof y === 'function') ||
                (x instanceof Date && y instanceof Date) ||
                (x instanceof RegExp && y instanceof RegExp) ||
                (x instanceof String && y instanceof String) ||
                (x instanceof Number && y instanceof Number)) {
                return x.toString() === y.toString();
            }

            // At last checking prototypes as good as we can
            if (!(x instanceof Object && y instanceof Object)) {
                return false;
            }

            if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {
                return false;
            }

            if (x.constructor !== y.constructor) {
                return false;
            }

            if (x.prototype !== y.prototype) {
                return false;
            }

            // Check for infinitive linking loops
            if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {
                return false;
            }

            // Quick checking of one object being a subset of another.
            // todo: cache the structure of arguments[0] for performance
            for (p in y) {
                if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
                    return false;
                } else if (typeof y[p] !== typeof x[p]) {
                    return false;
                }
            }

            for (p in x) {
                if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
                    return false;
                } else if (typeof y[p] !== typeof x[p]) {
                    return false;
                }

                switch (typeof(x[p])) {
                    case 'object':
                    case 'function':

                        leftChain.push(x);
                        rightChain.push(y);

                        if (!compare2Objects(x[p], y[p])) {
                            return false;
                        }

                        leftChain.pop();
                        rightChain.pop();
                        break;

                    default:
                        if (x[p] !== y[p]) {
                            return false;
                        }
                        break;
                }
            }

            return true;
        }

        if (arguments.length < 1) {
            return true; //Die silently? Don't know how to handle such case, please help...
            // throw "Need two or more arguments to compare";
        }

        for (i = 1, l = arguments.length; i < l; i++) {

            leftChain = []; //Todo: this can be cached
            rightChain = [];

            if (!compare2Objects(arguments[0], arguments[i])) {
                return false;
            }
        }

        return true;
    }

深度對比兩個對象是否完全相等够傍,可以封裝成一個組件方便隨時調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锰霜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子桐早,更是在濱河造成了極大的恐慌癣缅,老刑警劉巖厨剪,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異友存,居然都是意外死亡祷膳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門屡立,熙熙樓的掌柜王于貴愁眉苦臉地迎上來直晨,“玉大人,你說我怎么就攤上這事膨俐∮禄剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵焚刺,是天一觀的道長敛摘。 經(jīng)常有香客問我,道長乳愉,這世上最難降的妖魔是什么兄淫? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蔓姚,結(jié)果婚禮上捕虽,老公的妹妹穿的比我還像新娘。我一直安慰自己赂乐,他們只是感情好薯鳍,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挨措,像睡著了一般挖滤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浅役,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天斩松,我揣著相機與錄音,去河邊找鬼觉既。 笑死惧盹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞪讼。 我是一名探鬼主播钧椰,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼符欠!你這毒婦竟也來了嫡霞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤希柿,失蹤者是張志新(化名)和其女友劉穎诊沪,沒想到半個月后养筒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡端姚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年晕粪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渐裸。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡巫湘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橄仆,到底是詐尸還是另有隱情剩膘,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布盆顾,位于F島的核電站怠褐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏您宪。R本人自食惡果不足惜奈懒,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宪巨。 院中可真熱鬧磷杏,春花似錦、人聲如沸捏卓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怠晴。三九已至遥金,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒜田,已是汗流浹背稿械。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冲粤,地道東北人美莫。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像梯捕,于是被迫代替她去往敵國和親厢呵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉傀顾,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,719評論 0 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,103評論 1 32
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)襟铭,也就是一...
    悟名先生閱讀 4,149評論 0 13
  • 《生活的邀請函》 文/奧雷阿 我不在乎你如何謀生 只想知道 你有何渴望 是否敢追逐心中夢想 我不關(guān)心你年方幾...
    帥氣的農(nóng)村閱讀 212評論 0 1
  • 一棵樹 陰天雨天,灰土蒙蒙。 一條路 紅燈綠燈蝌矛,車水馬龍。 一個人 上班下班错英,行色匆匆入撒。 一座城 故鄉(xiāng)他鄉(xiāng),四季轉(zhuǎn)換椭岩。
    花自天涯閱讀 178評論 5 2