浅拷贝
方法一 Object.assign() let b = Object.assign({}, a)
方法二 扩展运算符 let b = {...a}
深拷贝
方法一 JSON.parse(JSON.stringify()) let b = JSON.parse(JSON.stringify(a))
优点:可以实现二级以上对象的拷贝;
缺点:函数、正则、undefined都无法拷贝;
方法二 递归
let a = {
name: "Jake",
flag: {
title: "better day by day",
time: "2020-05-31"
},
fn () {
console.log(2)
},
unde: undefined,
reg: /\d/
}
function deepClone (origin) {
if (typeof origin !== 'object' || origin == null) {
return origin
}
if (origin instanceof Date) {
return new Date(origin)
}
if (origin instanceof RegExp) {
return new RegExp(origin)
}
// region
// region-endRegion等同于 let result = new origin.constructor()
let result;
if (origin instanceof Array) { // 等同于Object.prototype.toString.call(origin) === '[object Array]'
result = []
} else {
result = {}
}
// endRegion
for (let key in origin) {
if (origin.hasOwnProperty(key)) {
result[key] = deepClone(origin[key])
}
}
return result
}
let b = deepClone(a)
b.name = 'gq'
b.flag.title = 'title'
console.log('b', b)
console.log('a', a)