浅克隆
浅克隆:如果对象的第一级属性中又包含引 用类型,则只复制地址
- 浅克隆的问题:如果对象中又包含引用类型的属性值,则导致克隆后,新旧对象依然共用同一个引用类型的对象属性值。
- 结果: 任意一方修改了引用类型的对象内容,都会导致另一方同时受影响。 浅拷贝方法:Object.assign(target, source), 遍历赋值等
深克隆
深克隆:不但复制对象的第一级属性值,而且,即使对象中又包含引用类型的属性值,深克隆也会继续复制内嵌类型的属性值。
- 结果: 克隆后,两个对象彻底再无瓜葛。
1, JSON.stringify()以及JSON.parse(),无法深克隆undefined值和内嵌函数
const source = {
name: 'xhh',
name: 16
}
const target = JSON.parse(JSON.stringify(source))
2, 自定义递归克隆函数
function deepClone_ (source) {
let target
if (typeof source === 'object') {
if (source === null) {
target = source
//数组的处理
} else if (Array.isArray(source)) {
target = []
for (let i of source) {
target[i] = source[i]
}
//正则表达式的处理
} else if (Object.prototype.toString.call(source) === '[object RegExp]') {
target = source
} else {
//普通对象的处理
target = {}
for (let i in source) {
target[i] = source[i]
}
}
} else {
// 基本数据类型的处理
target = source
}
return obj
}