JavaScript 深克隆

        /**
         * 方法一 在Object.prototype中添加clone();
         */
        Object.prototype.clone = function () {
            var o = this instanceof Array ? [] : {};
            for (var attr in this) {
                if (typeof this[attr] == "object") {
                    o[attr] = this[attr].clone();
                    continue;
                }
                o[attr] = this[attr]
            }
            return o;
        };
        /*
            test
           ----------------------------------------------------------
         */
        var obj = {
            a: 3,
            b: "p",
            c: false,
            d: function (e) {
                console.log(e);
            },
            e:undefined,
            arr: [1, 3, {
                a: 1,
                b: "2",
                arr: [1, , 3]
            }]
        };
        var object = obj.clone();
        object.arr[2].arr[0] = 4;
        console.log(obj.arr[2].arr[0]);
        console.dir(object)
        console.log(JSON.stringify(obj));
        console.log(JSON.stringify(object));

    /**
     * 或者定義一個(gè)copy();
     * 事實(shí)證明 JavaScript的類型自動(dòng)轉(zhuǎn)換能力真的很強(qiáng)將所有基本類型都包裝了 instanceof Object is true (坑爹).
     */

    function copy(obj) {
        if (!(obj instanceof Object)){
            return obj;
        }
        var o = obj instanceof Array ? [] : {};
        for (var attr in obj) {
            if (typeof obj[attr] == "object") {
                o[attr] = copy(obj[attr]);
            } else {
                o[attr] = obj[attr];
            }
        }
        return o;
    }
    /*
        test
     ----------------------------------------------------------
     */
    var obj = {
        a: 3,
        b: "p",
        c: false,
        d: function (e) {
            console.log(e);
        },
        arr: [1, 3, {
            a: 1,
            b: "2",
            arr: [1, 2, 3, {
                a: "c",
                arr: ["8", 1],
            }]
        }]
    };
    console.log(copy(4));
    var o = copy(obj);
    o.arr[2].arr[2] = 4;
    console.log(JSON.stringify(obj));
    console.log(JSON.stringify(o));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 最近在復(fù)習(xí),發(fā)現(xiàn)前端好多知識點(diǎn)牽一發(fā)動(dòng)全身。比如我想看一下JQuery的extend源碼,就不得不再好好看看深克隆...
    二璇妹妹閱讀 1,639評論 2 9
  • 淺復(fù)制 只是復(fù)制了引用,復(fù)制前后都指向同一個(gè)對象,彼此之間會相互影響 深復(fù)制 在堆中重新分配內(nèi)存,復(fù)制前后指向不同...
    07120665a058閱讀 243評論 0 3
  • 因?yàn)榻盏捻?xiàng)目需要用到對數(shù)組做深克隆,所以做一個(gè)簡要介紹與總結(jié)。 一開始聽說這個(gè)概念的時(shí)候嚇一跳,覺得高深莫測,有...
    FJW135閱讀 752評論 0 1
  • // ----------1、直接復(fù)制對象 ----------- // -------...
    hao小子閱讀 396評論 0 0
  • 說克隆之前,首先要說一下,js的數(shù)據(jù)類型 js中的數(shù)據(jù)類型分為兩大類:原始類型和對象類型。 1)原始類型包括:數(shù)值...
    你期待的花開閱讀 308評論 1 4

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