是否可以使用ES5JavaScript进行深度复制?
是否可以使用ES5JavaScript进行深度复制 我目前面临的问题是,嵌套深度超过2层的属性似乎是通过引用而不是通过值进行复制 以下是我目前为复制而实现的内容是否可以使用ES5JavaScript进行深度复制?,javascript,Javascript,是否可以使用ES5JavaScript进行深度复制 我目前面临的问题是,嵌套深度超过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]
// 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
属性似乎是引用类型
如何确保所有值都是按值复制的且不是引用?您正在克隆嵌套对象,但随后用原始对象再次覆盖它们:
if(typeof obj[prop] === 'object') {
newObj[prop] = clone(obj[prop]);
}
newObj[prop] = obj[prop]
请尝试以下方法:
if(typeof obj[prop] === 'object') {
newObj[prop] = clone(obj[prop]);
} else {
newObj[prop] = obj[prop]
}
你可以通过串接然后解析来使用可怜人的深层克隆:
功能克隆(obj){
返回JSON.parse(JSON.stringify(obj));
};
常数a={a:1,b:{c:2};
常数b=克隆(a);
a、 a=10;
console.log(b.a==a.a);//假的
console.log(a.b=10);
console.log(b.b==10);//假的
console.log(a.b.c=10);
console.log(a.b.c==b.b.c);//使用ES5时为true
var a=JSON.parse(JSON.stringify(b))
使用ES6
变量a=对象分配(b)
使用下划线/Lodash
变量a=u0.map(b,0.clone)
注意:别忘了这不会复制
函数
或RegExp
,而且这是非常慢的。注意,非常慢总是相对的。天哪。这是漫长的一天!但谢谢你发现了这一点。作品