如何在javascript中实现深度克隆

如何在javascript中实现深度克隆

如何深入克隆Javascript对象?

我知道有各种基于框架的函数,比如JSON.parse(JSON.stringify(o))$.extend(true, {}, o)但我不想用这样的框架。

什么是创建深度克隆的最优雅或最有效的方法。

我们确实关心像克隆数组这样的边缘情况,而不是破坏原型链,处理自引用。

我们不关心支持DOM对象的复制,而是因为.cloneNode就是因为这个原因。

因为我主要想在node.js使用ES5功能的V8引擎是可以接受的。

[编辑]

在任何人建议之前,让我提一提,通过从对象继承原型来创建副本和克隆它。前者使原型链变得一团糟。

[进一步编辑]

在阅读了你的答案后,我发现克隆整个物体是一个非常危险和困难的游戏,这是一个令人讨厌的发现。例如,下面基于闭包的对象

var o = (function() {
     var magic = 42;

     var magicContainer = function() {
          this.get = function() { return magic; };
          this.set = function(i) { magic = i; };
     }

      return new magicContainer;}());var n = clone(o); // how to implement clone to support closures

是否有任何方法来编写克隆函数,克隆对象在克隆时具有相同的状态,但不能更改o而不用JS编写JS解析器。

这样的功能不应该再存在于现实世界了。这只是学术上的兴趣。


茅侃侃
浏览 576回答 3
3回答

慕妹3146593

非常简单的方式,也许太简单了:var cloned = JSON.parse(JSON.stringify(objectToClone));

胡说叔叔

这个JSON.parse(JSON.stringify())合并到深度复制Javascript对象是一种无效的攻击,因为JSON不支持undefined和function () {},因此JSON.stringify当将Javascript对象“编组”到JSON时,将忽略代码的这些部分。以下函数将深入复制对象,并且不需要第三方库(jQuery、LoDash等)。function copy(aObject) {   if (!aObject) {     return aObject;   }   let v;   let bObject = Array.isArray(aObject) ? [] : {};   for (const k in aObject) {     v = aObject[k];     bObject[k] = (typeof v === "object") ? copy(v) : v;   }   return bObject;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript