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
相关产品推荐
相关产品推荐

