如何封装深拷贝?
1、使用JSON.parse(JSON.stringify())的方式
let list = [
{id: 1, stuName: '小米', class: '一年级一班'},
{id: 2, stuName: '小果', class: '一年级二班'},
{id: 3, stuName: '小红', class: '一年级三班'},
]
let newList = JSON.parse(JSON.stringify(list))
newList.push({id: 100})
console.log('list:',list)
console.log('newList:',newList)
优点:简单
缺点:不能拷贝方法 => function,故只能满足大概80%的需求

2、封装
function deepClone(source) {
const targetObj = source.constructor === Array ? [] : {}
for (let keys in source) {
// 判断是否有当前属性
if (source.hasOwnProperty(keys)) {
// keys可以存在的几种情况:3种,基础数据类型、对象、数组
// 引用数据类型
if (source[keys] && typeof source[keys] === 'object') {
// 维护层代码或提示代码(实际运行可删除也可保留)
targetObj[keys] = source[keys].constructor === Array ? [] : {}
// 递归
targetObj[keys] = deepClone(source[keys])
} else {
// 基本数据类型,直接赋值
targetObj[keys] = source[keys]
}
}
}
return targetObj
}
//示例
let testData = {
aa: 'name',
obj: {str: '哈哈哈', age: 12},
arr: [1,2,3,4]
}
//调用
let newTestData = deepClone(testData)
newTestData.aa = "今朝有酒"
newTestData.arr.push("今朝醉")
console.log('testData:', testData)
console.log('newTestData:', newTestData)

知识点补充:
1、[] 的constructor指向 Array(基类)
{}的的constructor指向 Object
2、代码分三类:运行代码、容错代码、维护层代码(提示代码)

浙公网安备 33010602011771号