如何修改以下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
相关产品推荐
相关产品推荐

