3

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

复制应该可以克隆

  • 嵌套对象

  • 嵌套数组

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

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

4

3 回答 3

1

我终于安顿下来了,jQuery.extend()因为我找不到其他好的实现

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

于 2012-02-25T12:01:31.107 回答
1

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

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;
}

性能比较

于 2015-02-26T20:37:27.003 回答
0

使用toSource 方法的模拟来复制对象:

    <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>
于 2012-02-29T06:30:02.373 回答