说到js中的深浅拷贝,首先我们要知道js中有两种数据类型,值类型和引用类型,值类型的数据存储于栈。而引用类型存储于堆中,在栈中的只是一个引用地址。如图
然后上代码
//值类型
let a = 100;
let b = a;
a = 200;
console.log(b); //100
//引用类型
let a = { age: 20 }; //a存的是一个引用地址
let b = a; //b相当于存了一个引用地址与a是同一个地址
b.age = 21;
console.log(a); //21
深拷贝就是为了解决引用类型,如上a的对象赋给b,b更改了对象中的值,由于a和b都是引用的同一个地址,所以a中的age也变了,但是通过深拷贝给b拷贝a,之后进行更改b,这是a还会是原来的值。
深拷贝代码如下,采用的递归:
/**
*
*深拷贝
* @param {Object} obj要拷贝的对象
* @return {*}
*/
function deepClone(obj = {}) {
console.log(typeof obj)
if (typeof obj !== "object" || obj == null) {
// obj 是null 或者不是对象和数组,直接返回
return obj;
}
let result;
if (obj instanceof Array) {
//利用 instanceof 判断是不是数组
result = [];
} else {
result = {};
}
for (const key in obj) {
//hasOwnProperty 保证传入的 key 不是原型的属性
if (obj.hasOwnProperty(key)) {
//递归调用
result[key] = deepClone(obj[key]);
}
}
//返回结果
return result;
}