## 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](http://api.jquery.com/jQuery.extend/) 2) loadsh.js ```var deep = _.cloneDeep(objects); ``` 详见[深度克隆](https://lodash.com/docs#cloneDeep) 3) underscore.js ``` var y = _.clone(x); ``` 2. JSON大法 ``` var cloneObj = (JSON.parse(JSON.stringify(originalObj))); ``` 关于以上两类三种方法的可以参考:[深入剖析 JavaScript 的深复制](http://jerryzou.com/posts/dive-into-deep-clone-in-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; } ```