1.赋值
赋值不创建新的对象,只是单纯的赋值而已,在赋值引用数据类型时
数据修改,会互相影响
let person = {
name:'person'
}
let person1 = person //这就是赋值,将地址值赋值给另一个变量而已
2.浅拷贝
浅拷贝,创建一个新的对象,这个对象里有着原始对象的一份精准拷贝,基础数据类型则是拷贝的值,引用数据类型拷贝的是地址值
方法一:for in 遍历添加
let person = {
name:'person',
hobby:['学习','游戏']
}
function utils(obj){
let newObj = {}
for( let i in obj ){
newObj[i] = obj[i]
}
return newObj //这种就是浅拷贝,创建了新的对象,里面的基础类型完全拷贝,但是引用类型依旧是地址
}
let person1 = utils(person)
person.name = '改变'
person.hobby[0] = '养猫'
console.log(person1) //{name:'person',hobby:['养猫','游戏']}
方法二.拓展运算符
let person = {
name:'person',
hobby:['学习','游戏']
}
let person1 = {...person}
person.name = '改变'
person.hobby[0] = '养猫'
console.log(person1) //{name:'person',hobby:['养猫','游戏']}
方法三.Object.assign()
//这种方法浅拷贝出来,基本类型数据发生改变,也会产生相互影响
let person = {
name:'person',
hobby:['学习','游戏']
}
let person1 = Object.assign(person)
person.name = '改变'
person.hobby[0] = '养猫'
console.log(person1) //{name:'改变',hobby:['养猫','游戏']}
3.深拷贝
深拷贝,在堆内存中开辟一个新的区域,用来存储新对象数据
与原始数据互不影响
方法一.递归
let person = {
name:'person',
hobby:['学习','游戏',{name:'爱好'}]
}
function utils(obj){
let newObj = {}
if(typeof obj != 'object')return obj
for( let i in obj ){
if(obj.hasOwnProperty(i))}{
newObj[i] = utils(obj[i])
}
}
return newObj
}
let person1 = utils(person)
方法二.JSON.stringify()和JSON.parse()
let person = {
name:'person',
hobby:['学习','游戏',{name:'爱好'}]
}
let person1 = JSON.parse(JSON.stringify(person))