是否可以使用 ES5 JavaScript 进行深度复制?
我目前遇到的问题是嵌套深度超过 2 层的属性似乎是按引用而不是按值进行复制。
这是我目前实现的复制...
// Clone an object and return the clone
function clone (obj) {
var newObj = (obj instanceof Array) ? [] : {};
for (var prop in obj) {
if(typeof obj[prop] === 'object') {
newObj[prop] = clone(obj[prop]);
}
newObj[prop] = obj[prop]
}
return newObj;
};
下面是用于测试的代码:
const a = { a: 1, b: { c: 2 }};
const b = clone(a);
a.a = 10;
b.a == a.a; // false
a.b = 10;
b.b == 10; // false
a.b.c = 10;
a.b.c == b.b.c; // true
最后一个更改了 a
和 b
对象中 c
的值。 c
属性似乎是引用类型。
如何确保所有值都是按值复制而不是引用?
最佳答案
你总是可以通过字符串化然后解析来使用穷人的深度克隆:
function clone (obj) {
return JSON.parse(JSON.stringify(obj));
};
const a = { a: 1, b: { c: 2 }};
const b = clone(a);
a.a = 10;
console.log(b.a == a.a); // false
console.log(a.b = 10);
console.log(b.b == 10); // false
console.log(a.b.c = 10);
console.log(a.b.c == b.b.c); // true
使用 stringify/parse 不会复制函数和 RegExp,因此是“可怜的人”。更好的选择是使用模块,例如 clone可以克隆一切。
关于javascript - 是否可以使用 ES5 JavaScript 进行深度复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46676378/