一般地, js 中的常见方法都是浅拷贝, 我们可以使用 JSON
的 api 实现深拷贝
JSON.parse(JSON.stringify(obj))
也可以使用下面的函数实现深拷贝
本质是新创建数组或者对象属性. 避免原对象/数组修改后, 影响新对象/数组
其中用到了递归
function deepClone(target) {
let dataType = getDataType(target)
let result
// 对象
if (dataType === 'Object') {
result = {}
for (let objKey in target) {
result[objKey] = deepClone(target[objKey])
}
// 数组
} else if (dataType === 'Array') {
result = []
target.forEach((value, index) => {
result[index] = deepClone(value)
})
// 非对象 / 非数组, 即 基本数据类型 / 函数直接赋值即可
} else {
result = target
}
return result
}
验证
let arr = [1, {name: 'wj'}]
let arr2 = deepClone(arr)
console.log(arr2);
arr[1].name = 'wwj'
console.log(arr2);
操作原数组, 并不会影响新数组的数据