值类型和引用数据类型的存储方式

327 阅读2分钟

值类型:

简单数据类型/基本数据类型

字符串: string , 数值: number, 布尔型: boolean, 未定义: undefined,空: null

在存储时变量中存储的是值本身

值类型变量的数据直接存放在变量(栈空间)中

Snipaste_2022-01-14_20-49-22.png

Snipaste_2022-01-15_11-38-00.png

let a = 1 在栈空间中单独开辟出一块小空间用于存放变量a的值1, let b = a 在栈空间中单独开辟出一块小空间用于存放变量b的值,将a的值赋值给b,此时b的值也为1

Snipaste_2022-01-14_20-50-45.png

Snipaste_2022-01-15_11-38-36.png

b = 2 b重新赋值为2,b变量在栈空间中存储的原本的值1被覆盖为2

引用类型:

复杂数据类型

对象: object , 数组:array , 函数: function

在存储时变量中存储的仅仅是地址(引用)

引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中

Snipaste_2022-01-14_20-57-29.png

Snipaste_2022-01-15_11-38-00.png

let obj1 = { name: '张三', age: 18, sex: '男' } 在栈空间中单独开辟出一块小空间用于存放对象obj1的存储地址,在堆空间中单独开辟出一块小空间用于存放对象obj1的属性(值),由栈空间中存储的地址指向堆空间中存储的属性(值)。 let obj2 = obj1将对象obj1存储在栈空间中的存储地址赋值给对象obj2,即对象obj1和对象obj2在栈空间中拥有相同的存储地址,指向同一个存放属性的堆空间。

Snipaste_2022-01-14_20-59-36.png

Snipaste_2022-01-15_19-55-14.png

obj2.name = '李四'表面上是修改obj2对象中name属性的值,实际上是修改对象obj2栈空间中的存储地址指向的堆空间中的name属性的值。因为对象obj1和对象obj2在栈空间中拥有相同的存储地址,所以对象obj2修改了堆空间中name属性的值后对象obj1的name属性的值也会一起修改。