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

JavaScript中const声明对象执行无关fetch操作后值意外变更问题求助

问题根因

你遇到的不是JavaScript语法层面的bug,是所用的discord.js库内置缓存更新逻辑导致的:

  • const声明仅保证变量的引用地址不可变,不会限制引用指向的对象、对象内部的属性修改,你存储的oldCache里的每个invite对象都是discord.js内部维护的缓存引用
  • 调用member.guild.invites.fetch()时,discord.js会自动拉取最新的邀请数据,同时更新全局缓存里所有对应invite实例的uses属性,你持有的oldCache里的invite和全局缓存是同一个引用,属性自然会同步变更
此前方案失效的原因

你用new Array、Array.from只做了浅拷贝,仅新生成了一个数组容器,数组里存储的invite对象还是指向原来的全局缓存实例,没有做深拷贝,所以内部属性更新还是会同步生效。

解决方案

如果需要拿到完全不会被后续缓存更新影响的旧邀请数据,要对每个invite对象做属性快照:

// 拿到缓存后直接做深快照,只存你需要的属性,不要存原invite实例
const oldCache = this.client.inviteCache.get(member.guild.id).map(invite => ({
  code: invite.code,
  uses: invite.uses,
  // 其他需要用到的属性都单独提取
}));
console.log(JSON.stringify(oldCache.map(invite => invite.uses)));
const newCache = await member.guild.invites.fetch().catch(this.client.noop);
console.log(JSON.stringify(oldCache.map(invite => invite.uses)));

如果需要完整拷贝invite实例避免引用关联,可以用结构化克隆实现深拷贝:

const oldCache = structuredClone(Array.from(this.client.inviteCache.get(member.guild.id).values()));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:06:01