什么是浅拷贝浅拷贝?
我觉得很多概念都太复杂了,我直接说我的理解吧
这是一个对象,我们现在要对它进行拷贝
const info = {
name: "wxy",
age: 18,
friend: {
name: "kone"
}
}
浅拷贝
{…info}就是浅拷贝,就是直接把这个对象解构出来赋值给newObj;
因为info本身会在内存中创建一个新的内存地址,且因为friend是一个对象,所以它也有自己的内存地址
因为解构赋值的过程相当于在内存地址创建了一个新的地址存储newObj,此时friend的内存地址也会一起复制过去,并没有给friend创建新的内存地址,它指向的还是旧的内存地址,当我们改变friend的name时,newObj和info的friend.name都会改变,
总结:浅拷贝相当于表层的复制
const newObj = {...info}
newObj.name = 'wqq'
console.log(newObj.name,info.name) // wqq wqq
newObj.firend.name = 'wjh
console.log(newObj.firend.name,info.friend.name) //wjh wjh
深拷贝
要想全部都复制过去,就需要用到深拷贝
方式一:
JSON.parse()方法用来解析 JSON 字符串
JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串
const obj3 = JSON.parse(JSON.stringify(info))
手写简单的深拷贝
function isObject(value){
const valueType = typeof value
return (valueType !== null) && (valueType === 'object' || valueType === 'function')
}
function deepCopy(originValue){
// 1. 判断orignValue 是不是对象,不是直接返
if (!isObject(orignValue)) {
return orignValue
}
// 2. 如果是对象类型,才需要创建对象
const newObj = {}
for (const key in orignValue) {
newObj[key] = deepCopy(orignValue[key])
}
return newObj
}