js 深拷贝和浅拷贝实现方法
时间: 2024-08-29 13:04:00 浏览: 52
在JavaScript中,深拷贝和浅拷贝是用来描述对象复制行为的两种不同方式。
浅拷贝(Shallow Copy):创建一个新对象,但是新对象的属性值是原始对象的引用。也就是说,如果原始对象的属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型(如数组、对象等),拷贝的就是内存中的地址,因此如果属性的值被修改,那么新对象的对应属性也会跟着改变。
浅拷贝的实现方法有:
1. 使用扩展运算符(...):`const浅拷贝对象 = {...原始对象};`
2. 使用Object.assign()方法:`const浅拷贝对象 = Object.assign({}, 原始对象);`
深拷贝(Deep Copy):创建一个新对象,新对象与原对象没有任何关联。新对象的属性值会递归地复制原始对象的所有层级,也就是说,如果原始对象的属性值是对象或数组,深拷贝会递归复制属性值,直到基本类型为止。
深拷贝的实现方法有:
1. 手动递归复制:编写一个递归函数,遍历原始对象的所有属性,对于每个属性值如果是对象或数组,则继续递归复制,否则直接赋值。
```javascript
function 深拷贝(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
if (obj instanceof Date) {
return new Date(obj);
}
if (obj instanceof RegExp) {
return new RegExp(obj);
}
let cloneObj = new obj.constructor();
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloneObj[key] = 深拷贝(obj[key]);
}
}
return cloneObj;
}
```
2. 使用JSON方法:`const深拷贝对象 = JSON.parse(JSON.stringify(原始对象));` 需要注意的是,这种方法不能拷贝函数和undefined属性,同时如果对象中存在循环引用,会报错。
阅读全文