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))