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

JavaScript中React/Redux场景下同个Promise结果设多状态时如何保证对象不可变

问题原因
  • Object.freeze属于浅冻结:仅会限制你修改最外层resp数组本身的引用、增减数组元素,不会递归冻结内部的子数组、对象属性,所以你代码里resp[0]的子数组、子数组里的每个对象依然是可修改的,之前加的冻结逻辑没有达到预期效果。
  • 你的parseData函数存在两处逻辑问题:
    • 遍历过程中直接修改原数组内对象的date属性,直接变更了原始数据
    • 最终返回的是原数组的引用,没有生成新数组,所以var1和var2指向同一个内存地址,自然会出现var1 === var2的结果,修改任意一个都会同步影响另一个。
解决方案

修改parseData函数,遍历过程中生成新数组+新对象,完全不触碰原始数据即可:

function parseData(data) {
  // map方法返回全新数组,每个元素通过展开运算符生成新对象后再修改date属性
  return data.map(item => ({
    ...item,
    date: new Date(item.date)
  }))
}

修改后var2是独立于原数据的全新数组,不会再修改var1对应的原始值,也不需要额外加Object.freeze逻辑。如果你的实际业务数据存在多层嵌套对象,可以用structuredClone做深拷贝,避免修改原数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:30:03