十分钟教你弄懂深浅拷贝
浅拷贝:
<script>
//浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用
//深拷贝拷贝多层,每一级别的数据都会被拷贝
var obj = {
id:1,
name:'andy',
msg:{
age:18
}
};
var o = {};
for(var k in obj){
//k是属性名,obj[k]是属性值
o[k]=obj[k];
}
console.log(o);
//改变o对象里msg的age属性值,发现obj对象里的msg的age也随着一起改变了
o.msg.age = 20;
console.log("---------------");
console.log(obj);
</script>
浅拷贝的语法糖:
Object.assign(o,obj); //把obj对象拷给o
深拷贝:
<script>
var obj={
id:1,
name:'andy',
msg:{
age:18
}
};
var o = {};
//封装深拷贝函数
function deepCopy(newobj,oldobj){
for(var k in oldobj){
//判断属性值属于哪种数据类型
//1、获取属性值 oldobj[k]
var item = oldobj[k];
//2、判断这个值是否是数组
if(item instanceof Array){
newobj[k]=[];
deepCopy(newobj[k],item);
//3、判断这个值是否是对象
}else if(item instanceof Object){
newobj[k]={};
deepCopy(newobj[k],item);
}else{
//4、如果是简单数据类型,则直接赋值
newobj[k] = item;
}
}
}
deepCopy(o,obj);
o.msg.age = 20;
console.log(o);
console.log("------------");
console.log(obj);
</script>
注意:深拷贝的代码部分一定要先判断属性是不是数组类型,然后再判断是不是对象属性,因为用instanceof这个方法进行判断的话,数组也是对象(因为js里万物皆对象),所以就区分不出数组和对象了,故一定要先判断是不是数组再判断是不是对象。