我的情况有点不同。我有一个包含嵌套对象和函数的对象。因此,Object.assign()
和 JSON.stringify()
对我的问题都不是解决方案。对我来说,使用第三方库也不是选项。
因此,我决定编写一个简单的函数,使用内置方法来复制一个对象及其字面属性、嵌套对象和函数。
let deepCopy = (target, source) => {
Object.assign(target, source);
Object.keys(source).forEach((prop) => {
if (typeof(source[prop]) === 'object') {
if (Array.isArray(source[prop])) {
target[prop] = Array();
source[prop].forEach((item, index) => {
if (typeof(item) === 'object') {
target[prop][index] = Object();
deepCopy(target[prop][index], item);
} else {
target[prop].push(item);
}
});
} else {
target[prop] = Object();
deepCopy(target[prop], source[prop]);
}
}
});
};
以下是一个测试代码:
let a = {
name: 'Human',
func: () => {
console.log('Hi!');
},
prop: {
age: 21,
info: {
hasShirt: true,
hasHat: false
}
},
mark: [89, 92, { exam: [1, 2, 3] }]
};
let b = Object();
deepCopy(b, a);
a.name = 'Alien';
a.func = () => { console.log('Wassup!'); };
a.prop.age = 1024;
a.prop.info.hasShirt = false;
a.mark[0] = 87;
a.mark[1] = 91;
a.mark[2].exam = [4, 5, 6];
console.log(a);
console.log(b);
为了提高效率方面的考虑,我认为这是解决我遇到的问题最简单和最有效的方法。如有任何可以使算法更加高效的评论,请不吝赐教。
eval()
通常是不明智的,因为许多JavaScript引擎的优化器必须在处理通过eval()
设置的变量时关闭。仅仅使用eval()
就可能导致代码性能更差。 - user56reinstatemonica8JSON
方法会丢失任何在JSON中没有等价的JavaScript类型。例如:JSON.parse(JSON.stringify({a:null,b:NaN,c:Infinity,d:undefined,e:function(){},f:Number,g:false}))
将生成{a: null, b: null, c: null, g: false}
。 - oriadam