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

