对象的深拷贝和浅拷贝

在js中,数据被分为基本数据类型和引用数据类型,基本数据类型如字符串 数字等这些不存在深浅拷贝的区别,都是值的拷贝,而引用类型如对象 数组这些,
他们的拷贝是对引用地址的拷贝,在深层嵌套的对象或数组的拷贝中,很容易造成浅拷贝, 只是将原对象的引用地址传递给新的对象,当其中一个对象中
的值改变,那么另一个对象的值同样也会改变。 而对象深拷贝会复制原对象的所有属性,并且对象和原对象相互独立,不受相互影响。
浅拷贝
我们现在使用的大多数可以用来复制对象或数组的方法基本都属于浅拷贝层次,
对象方面如:

对象的Object.assign()方法 
let obj ={
name:"meiqiuu",
info:{
gender:"1"
}
}
let copyObj=Object.assign({},obj)

for...in方法
let copyObj2={}
for(let key in obj){
copyObj2[key]=obj[key]
}
数组方面如:

扩展运算符
let arr=[{order:"1",info:{name:"meiqiuu",age:"2"}]
let copy1=[...arr]

 Array.from实现
let copy2 = Array.from(arr)

forEach实现
let copy3 = [];
arr.forEach(v=>copy3.push(v));

map实现
let copy4 = arr.map(v=>v);
深拷贝
JOSN.stringify()/JSON.parse()这种方法可以实现深拷贝 但如果对象中存在函数 就会丢失掉
let obj ={
name:"meiqiuu",
info:{
gender:"1"
},
eat:function(){
return "eat"
}
}
JSON.parse(JSON.stringify(obj))

递归深拷贝 对一个对象中的所有属性进行递归拷贝

 function copy(obj) {
            var newobj = null; 
            if (typeof obj === 'object' && obj !== null) {   
                newobj = obj instanceof Array ? [] : {}
                for (const key in obj) {
                    newobj[key] = copy(obj[key])
                }
            } else {
                newobj = obj
            }
            return newobj
        }

lodash库中的cloneDeep()
浏览器环境
<script src="lodash.js"></script>
Node环境
npm i --save lodash
var lodash = require('lodash');

var objects = [{ 'a': 1 }, { 'b': 2 }];
 
var deep = lodash.cloneDeep(objects);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值