关于javascript:ECMAScript5对象和数组的深层副本

ECMAScript5 deep copy of object and arrays

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

复制应该能够克隆

  • 嵌套对象

  • 嵌套数组

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

注意:jquery.extend()似乎不处理案例3)。另外,我希望用干净的ecmascript来做这个。快速搜索并没有带来任何有价值的实现。


如果需要一个一行程序(通过迭代引用的对象来检索基元来删除对象引用,连接一个大字符串,然后使用它自己的基元叶节点将该字符串解析为一个新对象)

1
JSON.parse(JSON.stringify(obj))

或者如果你需要做很多拷贝

1
2
3
4
5
6
7
8
9
10
11
12
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;
}

性能比较


我最终决定使用jQuery.extend(),因为我找不到其他好的实现。

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


使用tosource方法的仿真来复制对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    <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() );