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

问题:变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:45:48