1、递归拷贝
简化版只拷贝对象:
var a1 = {
name: 'zhang3',
age: 18,
sex: 'man',
children: {
name: 'zhang4',
age: 18,
sex: ''
}
}
function DeepCopy1(Origin) {
var Copy = {}
for (var key in Origin) {
if (typeof Origin[key] == 'object') {
Copy[key] = DeepCopy(Origin[key])
} else {
Copy[key] = Origin[key]
}
}
return Copy
}
拷贝对象和数组:
var a2 = {
name: 'zhang1',
age: 18,
sex: 'man',
children: {
name: 'zhang1',
age: 18,
sex: ''
},
friends: [{
name: 'zhang1',
age: 18,
sex: 'man'
}, {
name: 'zhang1',
age: 18,
sex: 'man'
}]
}
function DeepCopy2(Origin) {
//基本数据类型直接返回
if (typeof Origin != 'object' || Origin==null) return Origin
//判断引用类型为数组还是对象
var Copy = Array.isArray(Origin) ? [] : {}
for (var key in Origin) {
//保证key不是原型中的属性
if (Origin.hasOwnProperty(key)) {
//引用类型继续递归
Copy[key] = DeepCopy2(Origin[key])
}
}
}
2、JSON深拷贝:不能拷贝对象中的函数
//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone3(obj) {
var _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone;
}
3、JQuery深拷贝:第一个参数表示如果属性为引用类型会递归执行,第二个参数为拷贝容器,第三个为拷贝源
function deepCopy4(obj) {
if (typeof obj != 'object') return obj
//判断引用类型为数组还是对象
var copy = Array.isArray(obj) ? [] : {}
$.extend(true, copy, array)
return copy
}
4、Object.assign():缺点是只有顶层对象的第一层属性为深拷贝
var a3 = {
name: 'zhang3',
children: {
name: 'zhang4'
}
}
var b4 = {}
Object.assign(b4, a3)
b4.name = 'wang5'
b4.children.name = 'wang6'
console.log(a3, b4)
5、lodash.cloneDeep()