js分别能实现深拷贝和浅拷贝的方法及方式
时间: 2024-10-18 22:07:07 浏览: 31
JS浅拷贝和深拷贝原理与实现方法分析
JavaScript中实现深拷贝和浅拷贝主要是通过JSON对象和扩展数组的原型来进行的。
**浅拷贝(Shallow Copy)**:
1. 使用`JSON.parse()`和`JSON.stringify()`方法:将数据序列化成JSON字符串,然后再解析回一个新的JavaScript对象。这适用于基本类型的值和简单嵌套的对象,但对于复杂对象中的函数、循环引用等特性会丢失。
```javascript
let obj = { a: 1, b: [2] };
let shallowCopy = JSON.parse(JSON.stringify(obj));
// 对象b是共享的,修改原对象会影响浅拷贝
shallowCopy.b.push(3); // 修改后,原始obj.b也被改变
```
2. `Object.assign()`:如果目标对象不存在,可以创建新的对象,并逐个属性复制源对象到新对象。但这种方法对于复杂对象同样存在共享问题。
```javascript
const shallowAssign = Object.assign({}, obj);
```
**深拷贝(Deep Copy)**:
1. 使用递归:遍历原对象的所有属性并深度克隆每个元素。
```javascript
function deepCopy(obj) {
if (Array.isArray(obj)) return obj.map(deepCopy);
if (typeof obj === 'object' && obj !== null) {
let clone = {};
for (let key in obj) {
clone[key] = deepCopy(obj[key]);
}
return clone;
} else return obj; // 如果是基本类型,则直接返回
}
let deepClone = deepCopy(obj);
```
2. 使用第三方库如lodash的`_.cloneDeep()`方法:
```javascript
const _ = require('lodash');
let deepCloneWithLodash = _.cloneDeep(obj);
```
阅读全文