vue中js深拷贝

博客讲述在Vue里,将写死的this.option赋值给this.copyOption,请求接口后把接口数据再赋给this.copyOption,发现this.option数据也改变,怀疑是引用同一对象或内存地址,于是采用深拷贝方法,使this.copyOption数据变化时this.option不受影响。
this.copyOption = this.option 

this.option为写死的数据,将this.option赋值给this.copyOption,然后请求接口,将接口数据赋值给this.copyOption,我发现this.option里面的数据竟然和this.copyOption里面的数据一样了,我怀疑是引用了同一个对象或内存地址,所以这里我使用了深拷贝的方法

this.copyOption = JSON.parse(JSON.stringify(this.option));

这样this.copyOption里面的数据发生变化时this.option的数据就不会发生变化并赋值给this.copyOption

### Vue.js深拷贝的实现方式及使用场景 #### 深拷贝的定义与作用 深拷贝是指创建一个新的对象或数组,这个新的对象或数组会递归地复制源对象中的每一个属性及其子属性。这意味着如果源对象中有嵌套的对象或者数组,这些嵌套的内容也会被完全复制到目标对象中[^1]。这种方式确保了对副本的任何修改不会影响到原始数据。 #### 常见的深拷贝实现方法 以下是几种常见的深拷贝实现方式: 1. **利用 `JSON.parse` 和 `JSON.stringify`** 这是最简单的一种深拷贝方法,适用于大多数基本类型的对象和数组。不过需要注意的是,这种方法无法处理函数、`undefined` 或者某些特殊的类型(如日期、正则表达式等),并且不支持循环引用。 ```javascript const originalObj = { id: 1, name: '张三', age: 10 }; const deepCopiedObj = JSON.parse(JSON.stringify(originalObj)); ``` 2. **借助第三方库(如 Lodash 的 `cloneDeep` 方法)** 使用像 Lodash 这样的工具库可以提供更为强大的深拷贝功能,能够解决很多原生 JavaScript 方法所不能覆盖的特殊情况。 ```javascript import _ from 'lodash'; const originalObj = { date: new Date(), regex: /abc/ }; const deepCopiedObj = _.cloneDeep(originalObj); ``` 3. **自定义递归函数** 可以手动编写一个递归函数来完成深拷贝的任务,这样可以根据具体需求调整行为,例如保留函数或其他特殊类型的值。 ```javascript function deepClone(obj) { if (typeof obj !== 'object' || obj === null) return obj; if (Array.isArray(obj)) { return obj.map(item => deepClone(item)); } const clone = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { clone[key] = deepClone(obj[key]); } } return clone; } const originalObj = { nested: { value: true }, array: [1, 2, 3] }; const deepCopiedObj = deepClone(originalObj); ``` 4. **使用 `structuredClone` API** 在现代浏览器环境中,可以直接使用 `structuredClone` 来进行深拷贝操作。此方法相较于传统的 `JSON.parse` 更加强大且安全。 ```javascript const originalObj = { set: new Set([1, 2]), map: new Map([[1, 'one']]) }; const deepCopiedObj = structuredClone(originalObj); ``` #### 使用场景分析 - 当需要在一个组件内部保存一份独立的数据副本时,可以通过深拷贝避免外部状态变化带来的意外影响[^1]。 - 数据传输过程中,比如从父级向子级传递复杂结构的数据时,为了避免子组件无意间更改上游数据而导致错误传播,可以选择先做一次深拷贝再传入[^2]。 - 编辑表单提交前暂存用户的初始输入作为对比依据,之后无论用户如何改动临时存储区域里的资料,始端记录依旧保持稳定不受干扰。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值