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

为何JSON.stringify的两次比对结果不符合预期?

问题成因解释

核心原因是你在updatedAll2的代码里直接修改了原对象all中的属性值,导致原对象all和新对象updatedAll2的内容最终完全一致。

具体拆解:

  1. 看updatedAll2里的map回调逻辑:

    return e.name === "Stratford" ? { ...e, students: --e.students } : e;
    

    这里的--e.students是前置递减运算符,它会直接修改原数组中Stratford对象的students属性——把原本的120改成119,然后再把修改后的值赋值给新创建对象的students属性。

  2. 这就造成了两个结果:

    • 原对象all里的schools数组中,Stratford的students已经被悄悄改成了119;
    • updatedAll2的schools数组里,Stratford对应的新对象{...e, students: 119},因为此时e的students已经是119了,所以新对象的属性值也是119。
  3. 当你用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:01:04