Fork me on GitHub

深拷贝和浅拷贝

深拷贝和浅拷贝

参考:

http://t.csdn.cn/DN7D3

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);

image-20220813160108748

而深拷贝则多采用递归方式将子对象同时复制。

深拷贝:

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;
}

image-20220813160127178

或者:

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);
posted @ 2022-08-13 16:07  浩然哉  阅读(60)  评论(0)    收藏  举报
/* 看板娘 */
浏览器标题切换
浏览器标题切换end