深浅拷贝

Posted 周小猴儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深浅拷贝相关的知识,希望对你有一定的参考价值。

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

 

以上是关于深浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

《关于JavaScript的深浅拷贝》

python--is/id==,集合,深浅拷贝

python深浅拷贝

我要学python之深浅拷贝原理

Python高级语法-深浅拷贝-总结(4.2.1)

Python 的深浅拷贝 终于明白了