copy object in js
03 Nov 2016js复制的集中方法
众所周知,js中复制包括浅复制(Shallow Clone)和深复制(Deep Clone)两种,深复制的出现主要针对复杂数据结构,如数组和对象,其中浅复制就是运用赋值运算方式(“=”),为新对象引用所有的源对象属性,这不会产生新的对象,只是一个对象引用(reference)。而深复制则相对复杂一些,它是将所有的原始数据类型,机器所有的对象引用复制到新的对象中,这种复制最终会形成两个对象.关于两种复制的方法的论述已经有许多了,无外乎有以下三种:
- 第三方库,如underscore.js,jquery, loadsh
- JSON大法
- js原生方法
1. 关于第三方库的复制方法
1) jQuery
jQuery.extend( target [, object1 ] [, objectN ] );
#### 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;
}