如何避免const变量内存储的数据随底层引用对象的变更而被修改
问题根本原因
JavaScript中对象属于引用类型,你执行const originalData = docid[0][0].Record赋值时,只是把docid[0][0].Record指向的内存地址赋值给了originalData,两个变量指向的是同一个数据对象。因此后续你修改docid[0][0].Record的属性时,originalData读取到的自然也是修改后的值。
另外你代码中用到的_.extend(等价于_.assign)是浅合并方法,会直接修改第一个传入的参数对象,这也是原对象被变更的直接原因。
解决方法
只需要对docid[0][0].Record做深拷贝后再赋值给originalData,就能实现两个变量完全独立,修改互不影响,常用实现方案如下:
- 方案1(最适配你的代码场景):直接使用你代码中已经引入的Lodash提供的
_.cloneDeep方法,对复杂嵌套对象兼容性最好:// 替换你原来的赋值语句即可 const originalData = _.cloneDeep(docid[0][0].Record) - 方案2:如果你的
Record对象中没有函数、Symbol、undefined、循环引用等特殊类型,也可以用原生JSON序列化方案实现:const originalData = JSON.parse(JSON.stringify(docid[0][0].Record)) - 方案3:在支持现代JS标准的Node.js/浏览器环境中,也可以用原生内置的深拷贝方法:
const originalData = structuredClone(docid[0][0].Record)
如果你也不希望合并操作修改原docid[0][0].Record的属性,可以把_.extend的第一个参数换成空对象,例如:
// 原来的写法会直接修改docid[0][0].Record.mailingAddress // let MailingAddress = _.extend(docid[0][0].Record.mailingAddress, MailingAddrObj) // 修改后不会改动原对象属性 let MailingAddress = _.extend({}, docid[0][0].Record.mailingAddress, MailingAddrObj)
内容的提问来源于stack exchange,提问作者SamS87
相关产品推荐
相关产品推荐

