值类型:
简单数据类型/基本数据类型
字符串: string , 数值: number, 布尔型: boolean, 未定义: undefined,空: null
在存储时变量中存储的是值本身
值类型变量的数据直接存放在变量(栈空间)中
let a = 1 在栈空间中单独开辟出一块小空间用于存放变量a的值1,
let b = a 在栈空间中单独开辟出一块小空间用于存放变量b的值,将a的值赋值给b,此时b的值也为1
b = 2 b重新赋值为2,b变量在栈空间中存储的原本的值1被覆盖为2
引用类型:
复杂数据类型
对象: object , 数组:array , 函数: function
在存储时变量中存储的仅仅是地址(引用)
引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中
let obj1 = { name: '张三', age: 18, sex: '男' }
在栈空间中单独开辟出一块小空间用于存放对象obj1的存储地址,在堆空间中单独开辟出一块小空间用于存放对象obj1的属性(值),由栈空间中存储的地址指向堆空间中存储的属性(值)。
let obj2 = obj1将对象obj1存储在栈空间中的存储地址赋值给对象obj2,即对象obj1和对象obj2在栈空间中拥有相同的存储地址,指向同一个存放属性的堆空间。
obj2.name = '李四'表面上是修改obj2对象中name属性的值,实际上是修改对象obj2栈空间中的存储地址指向的堆空间中的name属性的值。因为对象obj1和对象obj2在栈空间中拥有相同的存储地址,所以对象obj2修改了堆空间中name属性的值后对象obj1的name属性的值也会一起修改。