假设我要删除JS对象中的属性
const source = {
nestA: {
nestB: {
nestC: 'deleteMe'
}
}
}
const clone = {}
clone.nestA = {...source}.nestA
delete clone.nestA.nestB
console.log(source)
执行上述脚本
期望:source
保持原样
实际:source
将变成{}
但是,如果我只做delete clone.nestA
,source
将会保持原样
问题:delete clone.nestA.nestB
如何影响source
。但是delete clone.nestA
不是吗?
答案 0 :(得分:3)
.transition {transition: width .5s ease;}
如何影响delete clone.nestA.nestB
,但source
却没有?
delete clone.nestA
和source
是不同的对象。从clone
属性和source.nestA
属性都引用了第三个对象。 (另一个对象位于该对象的clone.nestA
属性上。)
当删除nestB
上的属性(如source
属性时)只会影响source.nestA
对象。
删除第三个对象的属性,例如source
或source.nestA.nestB
(同一对象的相同属性)时,只会影响第三个对象。只是clone.nestA.nestB
和source
现在都引用了缺少属性的对象。
答案 1 :(得分:1)
您可以使用对象的assign方法来创建深层副本,这样您的源就无法被触摸。
let deepCopy = Object.assign({},source);
// do anything with deepCopy.
更新- 它不会创建嵌套对象的深层副本。您可以使用以下方法为嵌套对象创建深层副本。
let deepCopy = JSON.parse(JSON.stringify(source));
或
function cloneObject(obj) {
var clone = {};
for(var i in obj) {
if(obj[i] != null && typeof(obj[i])=="object")
clone[i] = cloneObject(obj[i]);
else
clone[i] = obj[i];
}
return clone;
}
检查