You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:36:01