当我们对数据进行操作的时候,会发生两种情况
基本数据类型直接赋值
引用类型数据修改拷贝的值之后会改变原来的值
具体原因请参考https://blog.csdn.net/weixin_46378921/article/details/107719915
下面介绍引用类型数据的拷贝
方法一:JSON.parse(JSON.stringify(obj))
缺点:不可以拷贝 null, function, RegExp 等等类型的
let obj = {
a: 1,
b: 2,
c: [1, 2, 3]
}
let newObj = JSON.parse(JSON.stringify(obj))
obj.c[0] = 2
console.log(newObj.c[0]) //1
方法二:Object.assign(target, source)
缺点:只能拷贝一层
let obj = {
a: 1,
b: 2,
c: [1, 2, 3]
}
let newObj = Object.assign({}, obj)
obj.a = 3
obj.c[0] = 2
console.log(newObj.c[0]) // 2
console.log(newObj.a) // 1
方法三:递归拷贝
function clone(target) {
let obj
// 如果是对象类型往下走否则直接赋值,null和RegExp的typeof也是object
if (typeof target === 'object') {
// 如果是数组就递归push
if (target instanceof Array) {
obj = []
for (let i in target) {
obj.push(clone(target[i]))
}
// 如果是null直接赋值
} else if (target === null) {
obj = null
// 如果是RegExp直接赋值
} else if (target.constructor === RegExp) {
obj = target
// 以上都不是就是普通对象for in 递归赋值
} else {
obj = {}
for (let key in target) {
obj[key] = clone(target[key])
}
}
} else {
obj = target
}
return obj
}