一、递归遍历实现深拷贝
//判断传入的数据类型并进行深拷贝
@param(target) // 需要拷贝的目标参数
export const deepClone = target => {
//定义一个变量
let result
//如果当前需要深拷贝的是一个对象
if(typeof target === 'object') {
//如果是一个数组
if (Array.isArray(target)) {
result = [ ]
for (const i in target) {
//递归克隆数组中的每一项
result.push(deepClone(targer[i]))
}
} else if (target === null) {
//判断当前值是null的话,直接赋值为null
} else if ( target.construcror === EegExp) {
result = target
} else {
// 否则为普通对象,直接for in 循环,递归赋 值对象的所有值
result = { }
for (const i in target) {
result[i] = (deepClone(targer[i]))
}
}
} else {
result = target
}
return result
}
二、JSON.parse(JSON.stringify(xxx))
(有局限性,如果有undefined、null。会丢失)
function deepClone (obj) {
let _obj = JSON.stringify(obj)
let objClone = JSON.parse(_obj)
return objClone
}
let a = [0,1,[2,3],4]
let b = deepClone(a)
a[0] = 1
a[2][0] = 1 // [1,1,[1,3],4]
b // [0,1,[2,3],4]
三、JQ的extend方法
$.extend([deep ], target, object1 [, objectN ])
deep表示是否深拷贝,为true为深拷贝;为false,为浅拷贝。
target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
object1 objectN可选。 Object类型 第一个以及第N个被合并的对象。
let a = [0,1,[2,3],4]
let b = $.extend(true, [], a)
a[0] = 1
a[2][0] = 1 // [1,1,[1,3],4]
b // [0,1,[2,3],4]