深入理解赋值、浅拷贝、深拷贝
区别
类型
和老数据指向同一对象
第一层数据为基本类型
老数据中包含子对象
赋值
是
改变会使原数据一同改变
改变会使原数据一同改变
浅拷贝
否
改变不会使原数据一同改变
改变会使原数据一同改变
深拷贝
否
改变不会使原数据一同改变
改变不会使原数据一同改变
数据类型
::: warning 基本数据类型 字符串( String )、数字( Number )、布尔( Boolean )、 Null 、 Undefined 、 Symbol ::: ::: warning 引用数据类型 对象( Object )、数组( Array )、函数( Function ) :::
基本数据类型直接存储在栈;引用数据类型存储的是该对象的引用地址,通过这个引用值从堆获得真实数据
对比
::: tip 赋值 将对象赋给变量时,赋的起始是对象在栈里的地址;所以变量和原对象指向同一个存储空间,因而改动原对象和变量都会改变存储空间的内容。 :::
let aa = {a: 1, b: {c: 2}}
let bb = aa
bb.a = 2
console.log(bb)
// {a:2, b: {c:2}}
console.log(aa)
// {a:2, b: {c:2}}
bb.b.c = 3
console.log(bb)
// {a:2, b: {c:3}}
console.log(aa)
// {a:2, b: {c:3}}::: tip 浅拷贝 浅拷贝是对属性值进行拷贝,如果属性是基本类型,拷贝的就是基本类型的值;如果是 Object , Array , Function 这类引用数据,拷贝的就是指向存储空间的引用地址;因而改变第一层属性为基本类型的属性值时,原对象数据不会改变;当改变属性为对象的引用类型数据时,原对象会跟着改变。 :::
::: tip 深拷贝 在浅拷贝的基础上,递归遍历引用对象属性,直到里面都是基本数据类型为止,再赋值给变量。 :::
::: tip JSON.parse(JSON.stringify())弊端
:::
参考
Last updated
Was this helpful?