深淺拷貝

在js中,變量所存的值分爲了原始類型和引用類型,其中Number,String是原始值,其餘是引用值。編程

原始類型的值在傳遞過程當中是按值傳遞,而引用類型傳遞的則是指針,即傳遞的僅僅只是引用關係,並不是真正的值,若內存中的真實值被修改,則全部引用此值的變量都會被更新。數組

在複製對象的過程當中,若是僅複製了引用指針,則稱爲淺複製;複製了真實值,則稱爲深複製。this

淺拷貝:spa

淺拷貝通常都是直接將對象賦值給新變量就完事兒了,對於原始值來講,副本和正本今後沒啥關係了。而對於引用類型,像數組和對象之類的值,副本和正本拿到的是同一個數據,數據更新後,正本和副本都會更新。指針

var obj = {
        name :'zhouxiaohouer',
        age:24,
        assets:{
            cash:1234,
            stock:22222
        },
        say:function() {
            console.log(this.name)
        }
    }
    var objb = obj
    obj.name = 'fixed'
    console.log(obj.name)//fixed
    console.log(objb.name)//fixed

深拷貝:
深拷貝本質上是遞歸實現淺拷貝,深拷貝以後,副本和正本今後也沒啥關係了。code

    var obj = {
        name :'zhouxiaohouer',
        age:24,
        assets:{
            cash:1234,
            stock:22222
        },
        say:function() {
            console.log(this.name)
        }
    }
    function deepCopy(o) {
        var backup = {}
        for(var key in o){
            backup[key] = typeof o[key] === 'object'?deepCopy(o[key]):o[key]
        }
        return backup
    }
    var objb = deepCopy(obj)
    obj.name = 'fixed'
    console.log(obj.name)//fixed
    console.log(objb.name)//zhouxiaohouer

數組的深拷貝則能夠藉助Array.slice(start[,end])來實現,對象的Object.create方式見面向對象編程系列。對象

相關文章
相關標籤/搜索