js深拷贝和浅拷贝是什么,以及实现方法
时间: 2023-03-31 21:03:59 浏览: 148
深拷贝和浅拷贝是指在复制对象时,是否复制对象内部的引用。浅拷贝只复制对象的引用,而深拷贝则会递归复制对象内部的所有引用。
实现浅拷贝可以使用 Object.assign() 方法或展开运算符。实现深拷贝可以使用 JSON.parse(JSON.stringify(obj)) 方法,或递归复制对象内部的所有引用。
相关问题
js 深拷贝和浅拷贝实现方法
在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属性,同时如果对象中存在循环引用,会报错。
js深拷贝和浅拷贝方法
在JavaScript中,深拷贝和浅拷贝是两种常用的对象拷贝方法。
浅拷贝是按位拷贝对象,创建一个新对象,并将原始对象的属性值精确拷贝到新对象中。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址。因此,如果其中一个对象改变了这个地址,就会影响到另一个对象。\[3\]
深拷贝是将原始对象及其所有嵌套对象的属性值都进行拷贝,创建一个全新的对象。深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。\[2\]
在JavaScript中,实现深拷贝的方法有以下几种:
1. 通过递归的方式实现深拷贝,可以使用jQuery中的extend方法来实现。这种方法会递归地遍历对象的所有属性,并进行拷贝。\[1\]
2. 使用JSON.parse()和JSON.stringify()方法来实现深拷贝。首先将对象转换为JSON字符串,然后再将JSON字符串转换为新的对象。这种方法可以实现简单的深拷贝,但是对于包含函数、正则表达式等特殊类型的对象可能会出现问题。\[1\]
3. 使用第一种方法中的递归方式来实现深拷贝。这种方法需要自己编写递归函数来遍历对象的所有属性,并进行拷贝。\[1\]
总结起来,深拷贝是将原始对象及其所有嵌套对象的属性值都进行拷贝,创建一个全新的对象,而浅拷贝只是按位拷贝对象,创建一个新对象,并将原始对象的属性值精确拷贝到新对象中。在JavaScript中,可以通过递归方式、JSON.parse()和JSON.stringify()方法等来实现深拷贝。
#### 引用[.reference_title]
- *1* [JavaScript深浅拷贝(三种方法)](https://blog.csdn.net/weixin_46022934/article/details/121415082)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* *3* [js实现浅拷贝和深拷贝](https://blog.csdn.net/ab_er/article/details/126009166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文
相关推荐















