深拷贝和浅拷贝
深拷贝和浅拷贝
参考:
https://github.com/mqyqingfeng/Blog/issues/32
- 基本类型:值类型
- 引用类型:地址类型,指向对象,数组等,表示内存栈区中指向堆区值的地址
拷贝就是赋值, 基本类型肯定是深拷贝, 引用类型则不一定。
如果引用类型的key也指向一个对象或者数组, 则普通的拷贝为浅拷贝, 新对象值的改变也会影响老对象, 两者都指向同一个地址。
浅拷贝:
var p = {
"id":"007",
"name":"刘德华",
"books":new Array("三国演义","红楼梦","水浒传")//这是引用类型
}
var p2 = {};
for(let key in p){
p2[key] = p[key];
}
p2.books[0] ="四国";
console.log(p2);
console.log(p);
而深拷贝则多采用递归方式将子对象同时复制。
深拷贝:
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;
}
或者:
var p = {
"id":"007",
"name":"刘德华",
"wife":{
"id":"008",
"name":"刘德的妻子",
"address":{
"city":"北京",
"area":"海淀区"
}
}
}
//写函数
function copyObj(obj){
let newObj={};
for(let key in obj){
if(typeof obj[key] =='object'){//如:key是wife,引用类型,那就递归
newObj[key] = copyObj(obj[key])
}else{//基本类型,直接赋值
newObj[key] = obj[key];
}
}
return newObj;
}
let pNew = copyObj(p);
pNew.wife.name="张三疯";
pNew.wife.address.city = "香港";
console.log(pNew);
console.log(p);