DarwinniwraD Data Painc

copy object in js

js复制的集中方法

众所周知,js中复制包括浅复制(Shallow Clone)和深复制(Deep Clone)两种,深复制的出现主要针对复杂数据结构,如数组和对象,其中浅复制就是运用赋值运算方式(“=”),为新对象引用所有的源对象属性,这不会产生新的对象,只是一个对象引用(reference)。而深复制则相对复杂一些,它是将所有的原始数据类型,机器所有的对象引用复制到新的对象中,这种复制最终会形成两个对象.关于两种复制的方法的论述已经有许多了,无外乎有以下三种:

  1. 第三方库,如underscore.js,jquery, loadsh
  2. JSON大法
  3. js原生方法

1. 关于第三方库的复制方法

1) jQuery

jQuery.extend( target [, object1 ] [, objectN ] );

详见jQuery extend

#### 2) loadsh.js

var deep = _.cloneDeep(objects); 

详见深度克隆

#### 3) underscore.js

 var y = _.clone(x);

2. JSON大法

var cloneObj = (JSON.parse(JSON.stringify(originalObj)));

关于以上两类三种方法的可以参考:深入剖析 JavaScript 的深复制(以下简称“深入”)

3. 原生方法

关于原生方法的写法倒是最有意思的一部分,也是写法最多的一个部分,“深入”一文对此做过讨论.笔者在这里也PO出Sasan Seydnejad写的一种方法:

function clone(deep) {
  var newClonedObj = new this.constructor();
    for (var property in this){
      if (!deep){
        //判断是否需要深复制,如不需要则只进行浅复制
        newClonedObj[property] = this[property];
      }else if (typeof this[property] == 'object'){
        //判断复制源类型,如果复制源是对象,则对其属性进行递归性复制;
        newClonedObj[property] = this[property].clone(deep);
      }else{
        //如果复制源是原始类型,则直接进行赋值复制
        newClonedObj[property] = this[property];
      }
    }
    return newClonedObj;
}