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

如何修改以下Snapshot类,使快照存储的数组不受原数组修改的影响?

修改Snapshot类实现独立快照存储

原代码的问题在于,数组是引用类型,直接将传入的数组赋值给this.array时,快照存储的是原数组的引用,导致原数组的修改会同步影响快照内的数组,反之亦然。要解决这个问题,我们需要在快照中存储原数组的独立副本,而非引用。

修改方案(针对一维数组)

以下几种方法都可以创建原数组的浅拷贝,生成独立的新数组:

方法1:使用Array.slice()

class Snapshot {
  constructor(array) {
    this.array = array.slice(); // 创建原数组的浅拷贝
  }
  restore() {
    return [...this.array]; // 每次恢复返回快照数组的拷贝,避免修改恢复后的数组影响快照
  }
}

方法2:使用展开运算符[...]

class Snapshot {
  constructor(array) {
    this.array = [...array]; // 创建原数组的浅拷贝
  }
  restore() {
    return [...this.array]; // 返回快照数组的拷贝
  }
}

方法3:使用Array.from()

class Snapshot {
  constructor(array) {
    this.array = Array.from(array); // 创建原数组的浅拷贝
  }
  restore() {
    return Array.from(this.array); // 返回快照数组的拷贝
  }
}

验证测试

运行示例代码:

var array = [1, 2];
var snap = new Snapshot(array);
array[0] = 3;
array = snap.restore();
console.log(array.join()); // 输出"1,2"
array.push(4);
array = snap.restore();
console.log(array.join()); // 输出"1,2"

两次输出均符合预期,说明快照数组完全独立于原数组及恢复后的数组。

补充说明

如果需要处理多维数组或包含引用类型元素的数组,浅拷贝无法完全隔离,此时需要实现深拷贝(比如递归拷贝、使用JSON.parse(JSON.stringify(array)),注意后者无法处理函数、Symbol等特殊类型)。但针对当前示例的一维基础类型数组,上述浅拷贝方案已足够。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:41:19