在JavaScript中深入克隆对象的最有效方法是什么?

什么是克隆JavaScript对象最有效的方法? 我见过obj = eval(uneval(o)); 正在使用,但这是非标准的,只有Firefox支持。

我做了像obj = JSON.parse(JSON.stringify(o)); 但质疑效率。

我也看到了带有各种缺陷的递归复制函数。
我很惊讶没有规范的解决方案存在。


注意:这是对另一个答案的回复,而不是对此问题的正确答复。 如果您希望快速克隆对象,请按照Corban的建议回答这个问题。


我想说明的是, jQuery中的.clone()方法仅克隆DOM元素。 为了克隆JavaScript对象,你可以这样做:

// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

更多信息可以在jQuery文档中找到。

我还想指出,深层副本实际上比上面显示的要聪明得多 - 它能够避免很多陷阱(例如尝试深入扩展DOM元素)。 它经常用于jQuery核心和插件中,效果很好。


结帐这个基准:http://jsben.ch/#/bWfk9

在我之前的测试中,速度是我发现的一个主要问题

JSON.parse(JSON.stringify(obj))

成为深入克隆对象的最快方法(它将深度标记设置为true 10-20%的jQuery.extend击败了)。

当深度标志设置为false(浅层克隆)时,jQuery.extend速度非常快。 这是一个不错的选择,因为它包含了一些额外的类型验证逻辑,并且不会复制未定义的属性等,但这也会让你稍微放慢一点。

如果您知道要克隆的对象的结构,或者可以避免嵌套深度较深的数组,您可以在检查hasOwnProperty时编写一个简单的for (var i in obj)循环来克隆对象,它将比jQuery快得多。

最后,如果您试图在热循环中克隆已知对象结构,只需简单地插入克隆过程并手动构建对象即可获得更多性能。

JavaScript跟踪引擎吸取优化for..in循环和检查hasOwnProperty会减慢你的速度。 手动克隆速度是绝对必须的。

var clonedObject = {
  knownProp: obj.knownProp,
  ..
}

注意在Date对象上使用JSON.parse(JSON.stringify(obj))方法 - JSON.stringify(new Date())以ISO格式返回JSON.stringify(new Date())的字符串表示形式, JSON.parse() 返回到Date对象。 看到这个答案更多细节。

另外,请注意,至少在Chrome 65中,本地克隆不是要走的路。 根据这个JSPerf,通过创建一个新的函数来执行本地克隆比使用JSON.stringify慢了将近800倍,而JSON.stringify在整个过程中非常快速。


假设你只有变量而不是你的对象中的任何函数,你可以使用:

var newObject = JSON.parse(JSON.stringify(oldObject));
链接地址: http://www.djcxy.com/p/89.html

上一篇: What is the most efficient way to deep clone an object in JavaScript?

下一篇: The Definitive C++ Book Guide and List