深淺拷貝的解決方案

複製基本數據類型不會有什麼問題,可是若是是引用數據類型,就會相互之間影響。數組

通常在數據結構比較簡單的狀況下,使用淺拷貝就能夠達到需求,若是數據結構比較複雜,就必須使用深拷貝。數據結構

 

淺拷貝:spa

  第一種: 使用 for...in來進行淺拷貝code

    var book = {
        name: 'JS修煉'
    }   
    var obj = {} 
    for (var v in book) {
        obj[v] = book[v]
    }
    book.name = '我是book'

  第二種: 使用Object.assign進行淺拷貝 對象

    var book = {
        name: 'JS修煉'
    }   
    var obj2 = Object.assign({},book)

在修改了book裏面的數據後,不會影響到新拷貝的數據,這樣就實現了淺拷貝blog

可是在使用淺拷貝的時候,若是對象裏面還包含別的引用類型,那麼若是修改這裏面的對象,就會影響到拷貝的數據遞歸

    var book = {
        name: 'JS修煉',
        list: {
            a: '我是a',
            b: '我是b',
            c: '我是c'
        }
    }   
    var obj = {} 
    for (var v in book) {
        obj[v] = book[v]
    }

    var obj2 = Object.assign({},book)
    book.name = '我是book'
    book.list.a = '我是修改book'

獲得的結果,會影響拷貝到的數據字符串

 

深拷貝:string

第一種:將數據轉爲字符串的形式而後再進行解析io

    var book = {
        name: 'JS修煉',
        list: {
            a: '我是a',
            b: '我是b',
            c: '我是c'
        }
    }   
    var obj = JSON.parse(JSON.stringify(book));
    book.name = '我是book'
    book.list.a = '我是修改book'
    console.log(book,'book')
    console.log(obj,'obj')

這種確實比較簡單的實現了深拷貝,可是存在一個問題,不能去拷貝function,或者是空的

第二種: 遞歸的方式進行深拷貝

  簡單的遞歸方式

    var book = {
        name: 'JS修煉',
        age: '',
        age2: undefined,
        list: {
            a: '我是a',
            b: '我是b',
            c: '我是c'
        },
        function () {  }
    }  

    function copy (obj) {
        var o = {}
        for (var i in obj) {
            if (typeof obj[i] === 'object') {
                o[i] = copy(obj[i])
            } else {
                o[i] = obj[i]
            }
        }
        return o;
    }
    var obj2 = copy(book)

    book.name = '我是book'
    book.list.a = '我是修改book'

    console.log(book,'book')
    console.log(obj2,'obj2')

這樣簡單的遞歸方式就實現了深拷貝,可是這樣寫存在一個問題,對數組沒法作處處理

完整的代碼以下

    var book = {
        name: 'JS修煉',
        age: '',
        age2: undefined,
        list: {
            a: '我是a',
            b: '我是b',
            c: '我是c'
        },
        author:['做者1','做者2'],
        author2:[
            {
                value: '我是author2'
            }
        ],
        function () {  }
    }
    function clone (obj) {
        var vv = null;
        if (typeof obj == 'object' && obj !== null) {
            vv = obj instanceof Array ? [] : {}
            for (var v in obj) {
                vv[v] = clone(obj[v])
            }
        } else {
            vv =obj
        }
        return vv;
    }
    var obj3 = clone(book)
    book.name = '我是book'
    book.list.a = '我是修改book'
    book.author[0] = 'w'
    book.author2[0].value = 'w'
相關文章
相關標籤/搜索