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

JavaScript对象数组备份赋值异常:反向影响问题咨询

问题分析与解决

运行环境问题

不管obj是全局变量还是函数内的变量,这个问题都会出现——它和全局/局部环境无关,核心原因是JavaScript引用类型的赋值机制。

异常原因拆解

JavaScript中,数组属于引用类型,赋值操作不会复制数组的实际内容,只会复制指向数组对象的内存引用。我们一步步拆解你的代码执行逻辑:

  1. 第一组操作正常的原因:

    • obj.var1 = [1, 10, 1]:创建了一个新的数组对象,obj.var1指向它
    • obj.var2 = obj.var1:让obj.var2也指向这个数组对象(此时两者共享同一个数组)
    • obj.var1 = [0, 2, 0]:给obj.var1重新赋值了一个全新的数组对象(此时obj.var1和obj.var2指向不同的数组)
    • obj.var1 = obj.var2:让obj.var1重新指向obj.var2对应的原数组,所以两者输出都是[1,10,1],符合预期
  2. 第二组操作异常的原因:

    • 经过第一组的最后一步,obj.var1和obj.var2再次指向同一个数组对象
    • obj.var1[1] = 99:直接修改了这个共享数组的第二个元素——因为obj.var2也指向该数组,所以obj.var2的内容也同步变成了[1,99,1]
    • obj.var1 = obj.var2:这一步只是让obj.var1的引用指向obj.var2当前指向的数组(也就是已经被修改过的那个),所以最终两者输出都是[1,99,1]

解决方法

如果需要备份数组的内容而非引用,必须创建数组的浅拷贝,常用方法有:

  • 扩展运算符:obj.var2 = [...obj.var1]
  • slice()方法:obj.var2 = obj.var1.slice()
  • Array.from():obj.var2 = Array.from(obj.var1)

修改后的关键代码示例:

obj.var1 = [1, 10, 1];
obj.var2 = [...obj.var1]; // 复制数组内容而非引用

// 后续操作中,修改obj.var1的元素不会影响obj.var2,恢复时也能得到原始内容

内容的提问来源于stack exchange,提问作者WayneF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 06:16:35