深拷贝与浅拷贝

1、浅拷贝复制的是指向对象的指针,并没有开辟新的内存,原对象和新对象共享的是同一块内存,所以修改新对象会影响原对象
2、深拷贝会开辟新的内存地址,原对象和新对象不共享同一内存,修改新对象不会影响到原来对象
(1)深拷贝

    var o={
                    x:1,
                    y:2,
                    z:{
                        z1:3,
                        z2:4
                    },
                    m:[{m1:5},3,5]
                }
                // 深拷贝  递归方法
                function deepClone(newo,old){
                    for(var k in old){
                        // 获得属性值
                        var item=old[k]
                        if(item instanceof Array){
                            newo[k]=[]
                            deepClone(newo[k],item)
                        }
                        else if(item instanceof Object){
                            newo[k]={}
                            deepClone(newo[k],item)
                        }
                        else{
                            newo[k]=item
                        }
                    }
                }
                var newo1={}
                deepClone(newo1,o)
                console.log(o)//{x: 1, y: 2, z: {…}, m: Array(3)}
                console.log(newo1)//{x: 1, y: 2, z: {…}, m: Array(3)}


                //采用JSON的方法
                var newo2=JSON.parse(JSON.stringify(o))
                console.log(newo2)//{x: 1, y: 2, z: {…}, m: Array(3)}

                //jquery中的extend()方法



 //引用复制
        function shall(obj){
            var newobj={}
            for(var i in obj){
                newobj[i]=obj[i]
            }
            return newobj
        }
        var newobj=shall(o)
        newobj.y=10
        console.log(o)
        console.log(newobj)

(2)浅拷贝
Object.assign() 可以把任意源对象的自身可枚举属性拷贝给目标对象,然后返回目标对象

var o={
                x:1,
                y:2,
                z:{
                    z1:3,
                    z2:4
                },
                m:[{m1:5},3,5]
            }
            //Object.assign()
            var newo1=Object.assign({},o)
            console.log(newo1)//{x: 1, y: 2, z: {…}, m: Array(3)}
            newo1.x=3
            newo1.z.z1=5
            console.log(newo1)//z1为5   x为3
            console.log(o)//z1为5   x为1

            //Array.prototype.concat()
            var o1=[1,2,3,{x:1,y:2}]
            var newo2=o1.concat()
            newo2[0]=3
            newo2[3].x=5
            console.log(newo2)//[1, 2, 3, {…}]
            console.log(o1)

            //Array.prototype.splice()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值