浅拷贝是什么?·就像把一本书的封面和目录直接贴到另一本书上·循环引用可能需要特殊处理以避免无限递归

浅拷贝是什么?

浅拷贝就像把书的封面和目录复制了一份,但是书里的每一页都是指向原书的,如果你在复制的目录上做了记号,原书的目录也会有同样的记号。

浅拷贝的两种常见方法

1. 使用Object.assign()方法

就像把一本书的封面和目录直接贴到另一本书上,Object.assign()会复制源对象的所有可枚举自有属性到目标对象上。

```javascript let obj1 = {a: 1, b: 2}; let obj2 = Object.assign({}, obj1); ```

2. 使用展开运算符(…)

这就像直接从一本书上撕下封面和目录,然后粘贴到另一本书上,展开运算符会展开一个对象的所有属性到另一个对象中。

```javascript let obj1 = {a: 1, b: 2}; let obj2 = {...obj1}; ```

浅拷贝的局限性

浅拷贝只复制顶层属性,如果对象里面有嵌套的子对象,那么这些子对象只是引用了原对象中的实例,如果你修改了子对象,原对象的子对象也会被修改。

深拷贝:完整的复制

深拷贝就像把整本书都复制一份,包括每一页的内容,复制出来的书和原书是完全独立的。

深拷贝的三种常见方法

1. 使用JSON.parse()和JSON.stringify()

这就像把书扫描成电子文档,然后再打印出来,JSON.parse()和JSON.stringify()可以将对象转换为JSON字符串,然后再解析成一个新的对象。

```javascript let obj1 = {a: 1, b: 2, c: {d: 3}}; let obj2 = JSON.parse(JSON.stringify(obj1)); ```

2. 递归拷贝

递归拷贝就像手把手地把书页一页一页地复制,你需要手动编写代码来处理每个属性。

```javascript function deepCopy(obj) { let copy; if (obj === null || typeof obj !== 'object') { return obj; } copy = Array.isArray(obj) ? [] : {}; for (let attr in obj) { if (obj.hasOwnProperty(attr)) { copy[attr] = deepCopy(obj[attr]); } } return copy; } ```

3. 使用第三方库(如lodash的cloneDeep方法)

第三方库提供的深拷贝方法通常更加强大,能够处理各种复杂情况,比如循环引用。

```javascript const _ = require('lodash'); let obj1 = {a: 1, b: 2, c: {d: 3}}; let obj2 = _.cloneDeep(obj1); ```

选择合适的拷贝方法

拷贝方法 适用场景 性能
浅拷贝 对象层级较浅,不包含嵌套子对象 速度快
深拷贝 对象层级较深,包含嵌套子对象 速度慢

注意事项

在拷贝过程中,需要注意以下几点:

实例应用

在Vue组件中,我们可以使用深拷贝来实现数据回滚的功能。

```javascript let obj1 = {a: 1, b: 2, c: {d: 3}}; let obj2 = _.cloneDeep(obj1); methods: { modifyData() { obj2.c.d = 4; }, resetData() { obj2 = _.cloneDeep(obj1); } } ```

合理使用对象拷贝方法,可以提高Vue项目的代码质量和数据管理能力。