深浅拷贝

在js中,变量所存的值分为了原始类型和引用类型,其中Number,String是原始值,其他是引用值。

原始类型的值在传递过程中是按值传递,而引用类型传递的则是指针,即传递的仅仅只是引用关系,并非真正的值,若内存中的真实值被修改,则所有引用此值的变量都会被更新。

在复制对象的过程中,如果仅复制了引用指针,则称为浅复制;复制了真实值,则称为深复制。

浅拷贝:

浅拷贝一般都是直接将对象赋值给新变量就完事儿了,对于原始值来说,副本和正本从此没啥关系了。而对于引用类型,像数组和对象之类的值,副本和正本拿到的是同一个数据,数据更新后,正本和副本都会更新。

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

深拷贝:
深拷贝本质上是递归实现浅拷贝,深拷贝之后,副本和正本从此也没啥关系了。

    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方式见面向对象编程系列。

原文地址:https://www.cnblogs.com/zhouxiaohouer/p/8037729.html