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

JavaScript动态创建对象数组时如何避免元素引用同一对象?

问题根源

JavaScript 中对象属于引用类型,你当前代码在全局作用域仅创建了1个results对象,每次执行finalResults[counter] = results时,存入数组的并不是对象的副本,而是这个对象的内存地址引用。所有数组元素都指向同一块内存空间,后续修改results的属性时,所有引用这个地址的数组元素自然会同步变更,最终数组里看起来全是同一个对象。

修复方案

核心逻辑:每次向数组写入数据时,都创建一个全新的独立对象,不要复用全局作用域下的同一个results对象。

写法1:函数内直接创建新对象(最适配当前场景)

直接把对象声明移到send函数内部,每次触发点击时都会生成独立的新对象,不会互相影响:

var randomCode = []
var fligthRange = []
var maintenanceArr = []
var finalResults = [] // 存储独立对象的结果数组
var counter = 0

function send(){ // 页面按钮点击触发的函数
  // 每次调用都生成全新的独立对象
  var results = {
    ID: randomCode[counter],
    range: fligthRange[counter],
    maintenance: maintenanceArr[counter]
  }
  finalResults[counter] = results
  counter++
}

写法2:基于模板对象拷贝生成新对象

如果你需要保留外部的对象模板做复用,可以用浅拷贝基于模板生成新对象,再赋值属性。你的场景下对象属性全是基础类型值,浅拷贝完全满足需求:

var randomCode = []
var fligthRange = []
var maintenanceArr = []
// 仅作为模板使用,不直接修改它
var resultTemplate = {ID: '', range: '', maintenance: ''}
var finalResults = []
var counter = 0

function send(){
  // 基于模板生成全新的拷贝对象
  var results = {...resultTemplate}
  results.ID = randomCode[counter]
  results.range = fligthRange[counter]
  results.maintenance = maintenanceArr[counter]
  finalResults[counter] = results
  counter++
}

注意:如果后续对象属性中存在嵌套的对象、数组等引用类型值,浅拷贝无法实现完全独立,需要额外做深拷贝处理,当前场景不需要。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:18:35