我需要创建veryBigObject的深度克隆。 veryBigObject需要首先通过initVeryBigObject初始化。 这就是它的样子:
initVeryBigObject = function(){
veryBigObject = {};
...
//Very Long Calculations to calculate the value of stuff.
...
veryBigObject = {data:stuff}
}
initVeryBigObject();
var clone = JSON.parse(JSON.stringify(veryBigObject)); //slow
or
eval('createClone = function(){ return ' + JSON.stringify(veryBigObject) + '}');
var clone = createClone(); //turns out to be x3 faster
我不是eval的忠实粉丝,但这是我看到克隆需要init的对象的唯一快速方式。 我错过了什么吗?
编辑:这个问题实际上并不是“克隆对象的最有效方法吗?”的重复。 这些方法在“克隆对象的最有效方法”中进行了讨论。是关于使用相同的功能克隆不同的对象。我的问题是关于多次克隆一个特定对象,显然,“克隆一个对象的最有效方法?”中讨论的方法。比我对我的评估“策略”所建议的要慢得多。
答案 0 :(得分:1)
告诉initVeryBigObject
停止制作全局变量。如果你正在复制任何东西,那么你很可能做错了。
function initVeryBigObject() {
return {
data: stuff // If stuff comes from somewhere else and you need
// to clone it, go for deeper object literals.
};
}
var veryBigObject = initVeryBigObject();
var clone = initVeryBigObject();
答案 1 :(得分:1)
我不知道你计划克隆你的大对象每秒有多少百次,但是我创建了a jsperf test来显示克隆速度比较。需要注意的一件重要事情是,您每次都在评估相同的字符串/对象,因此浏览器可能会记住其中一些结果,从而导致误导数字。
无论如何,评估方式很难看,因为它感觉不太安全,并且一段时间以来被认为是不好的做法。更不用说如果你有一个原始喜欢的对象,考虑{a: new Date(), y: /test/i}
它将无法正确克隆!
无论如何权衡正面和负面,但只有在功能之后才能考虑克隆等方法的性能优势!由于功能不一致,我建议采用迭代方法。