对象和数组的 ECMAScript5 深拷贝

Posted

技术标签:

【中文标题】对象和数组的 ECMAScript5 深拷贝【英文标题】:ECMAScript5 deep copy of object and arrays 【发布时间】:2011-12-26 21:53:23 【问题描述】:

我希望找到一个示例代码来对 ECMAScript5 中的对象进行深度复制。

复制应该可以克隆

嵌套对象

嵌套数组

数组中的嵌套对象(单独克隆每个数组项)

注意:jQuery.extend() 似乎无法处理案例 3)。另外,我希望在干净的 ECMAScript 中做到这一点。快速谷歌搜索并没有找到任何有价值的实现。

【问题讨论】:

深拷贝是一个很重要的问题,我建议你改变你的算法,让它适用于浅拷贝 目前我正在使用 jQuery.extend() 并在之后手动清理混乱 【参考方案1】:

我最终选择了jQuery.extend(),因为我找不到其他好的实现

http://api.jquery.com/jQuery.extend/

【讨论】:

【参考方案2】:

使用toSource method 的emulation 复制对象:

    <script type="text/javascript">
    Object.prototype.getSource = function() 
      var output = [], temp;
      for (var i in this) 
          if (this.hasOwnProperty(i)) 
              temp = i + ":";
              switch (typeof this[i]) 
                  case "object" :
                      temp += this[i].getSource();
                      break;
                  case "string" :
                      temp += "\"" + this[i] + "\"";    // add in some code to escape quotes
                      break;
                  default :
                      temp += this[i];
              
              output.push(temp);
          
      
      return "" + output.join() + "";
      
      var baz = "alpha":"beta":"charlie": ["delta","epsilon","omega":"zeta"];
      !!Object.prototype.toSource ? alert((baz).toSource() ) : alert((baz).getSource() );
    </script>

【讨论】:

一个开始,但这不是很脆弱.. 可能带有循环引用的无限循环? Contact the developer of this solution 寻求健壮性帮助。【参考方案3】:

如果你想要一个单线(通过迭代引用的对象来检索原语来删除对象引用,连接一个大字符串,然后用它自己的原始叶节点将字符串解析成一个新对象)

JSON.parse(JSON.stringify(obj))

或者如果您需要执行许多副本

function deepCopy(o) 
    var copy = o,k;

    if (o && typeof o === 'object') 
        copy = Object.prototype.toString.call(o) === '[object Array]' ? [] : ;
        for (k in o) 
            copy[k] = deepCopy(o[k]);
        
    

    return copy;

performance comparison

【讨论】:

什么意思?这确实执行了深层复制。它不是专门的 ECMAScript5,但 jQuery 也不是吗? 对不起!我的意思是请解释一下代码在做什么?

以上是关于对象和数组的 ECMAScript5 深拷贝的主要内容,如果未能解决你的问题,请参考以下文章

拷贝数组和对象,深拷贝,浅拷贝

浅拷贝和深拷贝

如何实现数组深拷贝和浅拷贝?

深拷贝与浅拷贝

深拷贝与浅拷贝

6javascript中对象和数组的深拷贝