详解深浅拷贝
作者:互联网
一、数组的浅拷贝
如果是数组,我们可以利用数组的一些方法,比如slice,concat方法返回一个新数组的特性来实现拷贝(但假如数组嵌套了对象或者数组的话,使用concat方法克隆并不完整)
如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或数组,就会只拷贝对象和数组的引用,这样我们无论在新旧数组进行了修改,两者都会发生变化,我们把这种复制引用的拷贝方法称为浅拷贝。
浅拷贝的实现:以上三个方法concat,slice,JSON.stringify都是技巧类,根据实际项目情况选择使用,我们可以思考下如何实现一个对象或数组的浅拷贝,遍历对象,然后把属性和属性值都放在一个新的对象里即可
var shallowCopy=function(obj){
//只拷贝对象
if(typeof obj!=='object')
return;
//根据obj的类型判断是新建一个数组还是对象
var newObj=obj instanceof Array?[]:{};
//遍历obj,并且判断是obj的属性才拷贝
for(var key in obj){
if(obj.hasOwnProperty(key)){ //这个方法可以用来检测一个对象是否含有特定的自身属性,返回值boolean
newObj[key]=obj[key];
}
}
return newObj;
}
二、深拷贝就是指完全的拷贝一个对象,即使嵌套了对象,两者也互相分离,修改一个对象的属性,不会影响另一个如何深拷贝一个数组
那如何实现一个深拷贝呢?在拷贝的时候判断一下属性值的类型,如果是对象,我们递归调用深拷贝函数不就好了~
var deepCopy=function(obj){
if(typeof obj !== 'object')
return;
var newObj=obj instanceof Array?[]:{};
for(var key in obj){
if(obj.hasOwnProperty(key)){
newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
}
}
return newObj;
}
或
function deepClone(obj){
var newObj=obj instanceof Array?[]:{};
for(var item in obj){
var temple=typeof obj[item]=='object'? deepClone(obj[item]) : obj[item];
newObj[item] = temple;
}
return newObj;
}
deepClone(['old',1,true,['old1','old2'],{old:1}])
ps:这里介绍一个技巧,不仅适用于数组还适用于对象!
var arr=['old',1,true,['old1','old2'],{old:1}]
var new_arr=JSON.parse(JSON.stringify(arr));//JOSN对象中的stringify可以把一个js对象序列化为一个JSON字符串
//parse可以把JSON字符串反序列化为一个js对象
console.log(new_arr);
原理是,
通过这方法,也可以实现对象的深复制。但是这个方法不能够拷贝函数
标签:obj,数组,newObj,详解,深浅,key,var,拷贝 来源: https://blog.csdn.net/weixin_48629519/article/details/121364532