平常在写代码时经常会用到拷贝函数,谈到拷贝,我们要理解js数据储存位置,栈和堆, 简单数据类型会储存在栈内存中, 复杂数据类型会存在堆内存中, 给对象直接赋值另一个对象,不是拷贝内容,而是把对象在栈内存中的地址值赋给了新对象
当我们拷贝简单数据类型时,只用浅拷贝就可以获得一个数据相同但是,和原数据互不相干的新数据
数据浅拷贝
数据浅拷贝大致有三种方法
1. 扩展运算符(…)
条件:数组内不包含复杂数据类型
const originalArray = [1, 2, 3]; const shallowCopyArray = [...originalArray];
2. Array.prototype.slice() 数组的slice(方法)
数组的slice传参就是截取数组中某一段,不传参数会返回一个与原数组属性相同的新数组 条件:数组内不包含复杂数据类型
const originalArray = [1, 2, 3];
const shallowCopyArray = originalArray.slice();
3. Object.assign()
Object.assign()
方法用于将所有可枚举属性的值从一个或多个源对象source
复制到目标对象。它将返回目标对象target
。
const originalObject = { name: "John", age: 30 };
const shallowCopyObject = Object.assign({}, originalObject);
深拷贝
1. 使用JSON序列化和反序列化
onst originalObject = { name: "John", age: 30 };
const deepCopyObject = JSON.parse(JSON.stringify(originalObject));
使用json序列化会把数据平铺开
注意:使用这种方法进行深拷贝时,需要确保对象或数组中不包含循环引用,否则会导致无限循环。
2. 递归复制
function deepCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
const originalObject = { name: "John", age: 30 };
const deepCopyObject = deepCopy(originalObject);
以上是常见的浅拷贝和深拷贝的实现方法,根据情况选择适合的方式进行对象和数组的复制。