深拷贝与浅拷贝的区别:
浅拷贝是新增了一个指针指向原来对象的地址(此时原来的指针和后来拷贝新增的指针都指向原来的指针指向的地址),改变拷贝来的对象的属性,原来的对象相应属性也会随之改变;而深拷贝不仅新增了一个指针,还开辟了一个新的内存空间来存储拷贝来的对象(此时原来的指针还是指向原来的地址,而新增的指针指向新开辟的地址),改变拷贝来的对象的属性,原来的对象相应的属性不会改变。
浅拷贝:
- 基本数据类型的值拷贝 --- 当拷贝的数据类型为基本数据类型时,属于浅拷贝,且只拷贝值,当我们改变拷贝的值(b)时,被拷贝的值(a)不发生改变。基本数据类型包括:Number、String、Boolean、Null、undefined、Symbol、bigInt
- 对象类型的地址拷贝 --- 当拷贝的数据类型为对象类型时,拷贝的是该对象的地址,当改变拷贝后的对象的值时,被拷贝的对象也会发生改变
改变被拷贝的值后:star2.song改变了,star1.song也改变了
深拷贝:
- 第一种方法:(最笨的方法)
改变被拷贝的值后:star2.song改变了,star1.song没有改变
2.Object.assign()方法:如果有嵌套的情况下(大括号套着大括号{{}}),只能深拷贝一层,一般在没有嵌套的时候使用:
如果有嵌套的情况:
3.转成JSON格式(不怕嵌套):json.stringify(star1),将star1转为字符串格式,赋值给star2,再json.parse(star2)将star2转回对象的格式,完成了深拷贝:
4.递归深拷贝: