为了账号安全,请及时绑定邮箱和手机立即绑定

如何在javascript中实现深度克隆

如何在javascript中实现深度克隆

茅侃侃 2019-07-02 16:56:28
如何在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解析器。这样的功能不应该再存在于现实世界了。这只是学术上的兴趣。
查看完整描述

3 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

非常简单的方式,也许太简单了:

var cloned = JSON.parse(JSON.stringify(objectToClone));


查看完整回答
反对 回复 2019-07-02
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

这个JSON.parse(JSON.stringify())合并到深度复制Javascript对象是一种无效的攻击,因为JSON不支持undefinedfunction () {},因此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;}


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 575 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信