为何JSON.stringify的两次比对结果不符合预期?
问题成因解释
核心原因是你在updatedAll2的代码里直接修改了原对象all中的属性值,导致原对象all和新对象updatedAll2的内容最终完全一致。
具体拆解:
看
updatedAll2里的map回调逻辑:return e.name === "Stratford" ? { ...e, students: --e.students } : e;这里的
--e.students是前置递减运算符,它会直接修改原数组中Stratford对象的students属性——把原本的120改成119,然后再把修改后的值赋值给新创建对象的students属性。这就造成了两个结果:
- 原对象
all里的schools数组中,Stratford的students已经被悄悄改成了119; updatedAll2的schools数组里,Stratford对应的新对象{...e, students: 119},因为此时e的students已经是119了,所以新对象的属性值也是119。
- 原对象
当你用
JSON.stringify对比两者时,原对象all和updatedAll2的内容已经完全相同,自然返回true。
对比updatedAll的正确逻辑:
updatedAll里是直接写死students: 119,没有碰原对象all的属性,所以原对象里Stratford的students还是120,和updatedAll里的119形成差异,因此JSON.stringify(all) === JSON.stringify(updatedAll)返回false,符合你的预期。
修复方案
如果想避免修改原对象,同时得到正确的新对象,把--e.students改成不修改原对象的写法就行:
// 推荐:直接用原数值减1,不改动原对象 { ...e, students: e.students - 1 }
内容的提问来源于stack exchange,提问作者oneny
相关产品推荐
相关产品推荐

