深拷贝与浅拷贝

本文详细介绍了JavaScript中浅拷贝的两种常见实现:等号赋值和`Object.assign`方法,并通过示例展示了它们如何改变原始对象。接着,探讨了深拷贝的两种方法:`JSON.stringify`与`JSON.parse`转换以及递归遍历拷贝,强调了深拷贝在保护原始数据不变性上的重要性。
摘要由CSDN通过智能技术生成

1. 浅拷贝的三种方式

  •    用等号=直接赋值引用地址
  •    通过for  in进行循环赋值,若存在嵌套对象时,也属于浅拷贝
            let userinfo = {
                name:     '张三',
                age: 18,
                address: {
                    province: '广东',
                    city: '中山'
                }
            }
            let newinfo = {}
                for(let key in userinfo){
                newinfo[key] = userinfo[key]
            }
            newinfo.address.city = '广州'
            console.log(newinfo.address.city)  //广州
            console.log(userinfo.address.city) //广州
  • 通过Object.assign
                let userinfo = {
                    name: '张三',
                    age: 18,
                    address: {
                        province: '广东',
                        city: '中山'
                    }
                }
                let newinfo = Object.assign({}, userinfo)
                newinfo.address.city = '广州'
                console.log(newinfo.address.city)  //广州
                console.log(userinfo.address.city)  //广州

     

2. 深拷贝的方法

  • 通过JSON.stringify和JSON.parse转换
            let userinfo = {
                name: '张三',
                age: 18,
                address: {
                    province: '广东',
                    city: '中山'
                }
            }
            let newinfo = JSON.parse(JSON.stringify(userinfo))
            newinfo.address.city = '广州'
            console.log(newinfo.address.city)  //广州
            console.log(userinfo.address.city)  //中山
  • 通过递归遍历拷贝
                let userinfo = {
                    name: '张三',
                    age: 18,
                    address: {
                        province: '广东',
                        city: '中山'
                    }
                }
                function func(obj){
                    if(typeof obj !== 'object'||obj === null){
                        return obj
                    }
                    let newObj
                    if(obj instanceof Array){
                        newObj = []
                    }
                    else{
                        newObj = {}
                    }
                    for(let key in obj){
                        if(obj.hasOwnProperty(key)){
                            newObj[key] = func(obj[key])
                        }
                    }
                    return newObj
                }
                let newinfo = func(userinfo)
                newinfo.address.city = '广州'
                console.log(newinfo.address.city)  //广州
                console.log(userinfo.address.city)  //中山

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值