谈谈深拷贝和浅拷贝

今天在做项目购物车需求的时候,遇到一个同深拷贝、浅拷贝相关的问题,所以来谈谈深拷贝和浅拷贝。
什么是深拷贝?复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针和堆内存中的对象。
什么是浅拷贝?复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针,不复制堆内存中的对象。
说的通俗易懂些,就是假设B赋值给A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝。在项目的过程中,要关注js代码里对象、数组的赋值是否对页面的显示有影响?是否因为改变了某个值,导致其他相同级别的也随之变化?
1、如果我们不想因为改变引用类型里某个值,导致其他相同级别的也随之变化,那么对引用类型的拷贝要采用深拷贝。
网上的方法也有很多种:
(1)采用递归去拷贝所有层级属性
function deepClone(obj){
let obj2 = Array.isArray(obj)?[]:{};
if(obj && typeof obj=== “object” ){
for(key in obj){
if(obj.hasOwnProperty(key)){
obj2 [key] = typeof obj[key] === ‘object’ ? deepCopy(obj[key]) : obj[key];
}
}
}
return obj2 ;
}
let a=[1,2,3,4],
b=deepClone(a); // 深拷贝
a[0]=2;
(2)通过JSON对象来实现深拷贝
let a=[1,2,3,4],
b=JSON.parse(JSON.Stringify(a)); // 深拷贝
b[0]=2
缺点: 无法实现对对象中方法的深拷贝,会显示为undefined
(3)如果对象的value是基本类型的话,也可以用Object.assign来实现深拷贝,但是要把它赋值给一个空对象
var obj = {
a: 2,
b: 3
}
*var obj1 = Object.assign({}, obj); // obj赋值给一个空{}
obj1.a = 3;
console.log(obj.a);// 3
(4)像slice、concat这些数组的操作方法都是数组的深拷贝。
(5)使用扩展运算符实现深拷贝
1、当value是基本数据类型,是可以使用拓展运算符进行深拷贝的
2、当value是引用类型的值,引用类型进行深拷贝也只是拷贝了引用地址,所以属于浅拷贝
var people= {age: “12”, weight: “140”, height: “178”}
var people1 = { …people, weight: “150” }
console.log(people1); // {age: “12”, weight: “150”, height: “178”}
console.log(people); // {age: “12”, weight: “140”, height: “178”}
2、浅拷贝
(1)Object.assign方法
var obj = {
a: 1,
b: 2
}
var obj1 = Object.assign(obj);
obj1.a = 3;
console.log(obj.a) // 3
(2)直接用=赋值
let a=[0,1,2,3,4],
b=a;
a[0]=1;
console.log(b); // [1,1,2,3,4],
(3)遍历对象,然后把属性和属性值都放在一个新的对象
function simpleCopy(obj1) {
var obj2 = Array.isArray(obj1) ? [] : {};
for (let i in obj1) {
if (obj1.hasOwnProperty(i)) {
obj2[i] = obj1[i];
}
}
return obj2;
}
var obj1 = {
a: 1,
b: 2,
c: {
d: 3
}
}
var obj2 = simpleCopy(obj1);
obj2.a = 3;
obj2.c.d = 4;
console.log(obj1.a); // 1
console.log(obj2.a); // 3
console.log(obj1.c.d); // 4
console.log(obj2.c.d); // 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值