问题:变量oldPlayerStats为何随G.playerStats同步更新而非保留初始值?
解决对象引用导致的变量同步更新问题
你遇到的问题本质是JavaScript引用类型的赋值特性:对象和数组都是引用类型,当你执行const oldPlayerStats = G.playerStats;时,并没有把G.playerStats的内容复制一份给oldPlayerStats,只是把指向该对象/数组的内存地址赋值给了它。两者指向同一块内存空间,所以修改G.playerStats的内容时,oldPlayerStats自然会同步变化。
要解决这个问题,你需要对G.playerStats进行深拷贝,创建一个完全独立的副本,而不是只复制引用。以下是几种可行的方案:
方案1:JSON序列化反序列化(简单通用)
如果G.playerStats里没有函数、undefined、Symbol这类JSON不支持的类型,这个方法最省事:
const oldPlayerStats = JSON.parse(JSON.stringify(G.playerStats)); console.log(oldPlayerStats[0].wood); // 输出10 cardFunction.function(G, ctx, ctx.currentPlayer, G.opponent, G.attackMultiplier); console.log(oldPlayerStats[0].wood); // 保持10,不受G.playerStats更新影响
方案2:展开运算符(浅拷贝,适合单层结构)
如果G.playerStats是单层数组(数组元素不是对象/数组),可以用展开运算符快速拷贝:
const oldPlayerStats = [...G.playerStats];
但如果数组里的元素是对象(比如你的oldPlayerStats[0]是包含wood属性的对象),这个方法只能拷贝数组本身,内部的对象还是引用,修改G.playerStats[0].wood时,oldPlayerStats[0].wood依然会变,所以这种情况不适用。
方案3:手动递归深拷贝(灵活处理特殊类型)
如果G.playerStats包含JSON不支持的类型(比如函数),可以自己写一个递归函数来实现深拷贝:
function deepCopy(obj) { if (typeof obj !== 'object' || obj === null) { return obj; } // 处理数组 if (Array.isArray(obj)) { return obj.map(item => deepCopy(item)); } // 处理对象 const copiedObj = {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { copiedObj[key] = deepCopy(obj[key]); } } return copiedObj; } // 使用深拷贝函数 const oldPlayerStats = deepCopy(G.playerStats);
内容的提问来源于stack exchange,提问作者evilgenious448
相关产品推荐
相关产品推荐

