目录
2.JSON.parse(JSON.stringify())
一、基本概念
深拷贝就是完全拷贝一份新的对象,会在堆内存中开辟一份新的空间,拷贝的对象被修改后,原对象不会受到影响,主要针对的是引用数据类型。
二、实现方法
1.扩展运算符
let obj = {
name:张三,
age:18
}
let obj1 = {...obj}
obj1.name = '王五'
console.log(obj)
//{name:'张三' , age:18}
console.log(obj1)
//{name:'王五' , age:18}
缺点:这个方法只能针对第一层拷贝,当有多层的数据内容时实际上执行的还是浅拷贝。
2.JSON.parse(JSON.stringify())
let obj = {
name:张三,
age:18,
say(){
console.log('我执行了')
}
}
let obj1 = JSON.parse(JSON.stringify(obj))
obj1.name = '王五'
console.log(obj) //{name:'张三' , age:18}
console.log(obj1) //{name:'王五' , age:18}
缺点:该方法并不会拷贝内部函数。
JSON.parse():将JSON格式的字符串转换为JavaScript对象。
JSON.stringify():将 JavaScript 对象或值转换为 JSON 字符串。
3.利用递归函数实现
let origin = {
name:张三,
age:18,
say(){
console.log('我执行了')
},
arr:[[1,2],3,4,5]
}
function exten(origin,deep){
let obj = {}
if(origin instanceof Array){
obj = []
}
for(let key in origin){
let value = origin[key]
obj[key] = (!!deep && typeof value === 'object' && value !== null) ? exten(value,deep) : value
}
return obj
}
//测试
const ooo = exten(origin,true)
obj.arr[0].push(888)
console.log(origin)
console.log(ooo)
这段代码它首先定义了一个名为origin的对象,然后定义了一个名为 exten 的函数,该函数接受两个参数:origin 和 deep。origin 是要深度扩展(或复制)的对象,而 deep 参数用于确定是否进行深度复制。
在 exten 函数中,首先创建一个空对象 obj 。然后检查 origin 是否为数组,如果是,将 obj 设置为空数组。
接下来函数使用一个 for...in 循环遍历 origin 对象的每个属性。对于每个属性,它获取该属性的值(let value = origin[key]),并检查这个值是否为非null的object类型。如果 deep 是true并且该属性的值是object类型,那么它会递归调用 exten 函数来深度复制该属性值,否则,它只是将属性值复制到新的对象中。
在所有属性都被处理之后,该函数返回新的对象。