深入理解赋值、浅拷贝、深拷贝

区别

类型
和老数据指向同一对象
第一层数据为基本类型
老数据中包含子对象

赋值

改变会使原数据一同改变

改变会使原数据一同改变

浅拷贝

改变不会使原数据一同改变

改变会使原数据一同改变

深拷贝

改变不会使原数据一同改变

改变不会使原数据一同改变

数据类型

::: warning 基本数据类型 字符串( String )、数字( Number )、布尔( Boolean )、 NullUndefinedSymbol ::: ::: 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?