8种基本数据类型
number
string
boolean
null
undefined
symbol
bigint
object
基本类型和引用类型
前7种为基本类型,最后一种为引用类型。
其中,引用类型中包括
array数组
object对象
function函数
- 特殊对象:
Date
、RegExp
- ES6新增类型
set
、map
、weakSet
、weakMap
等。
关于数组可以这么理解:数组的键是按顺序排列的索引,值就是当前值,因此可以看作是一种特殊的对象。
基本类型和引用类型的区别
- 基本类型按值访问,引用类型按引用访问
- 基本类型按值存储在栈内存中
- 引用类型按引用存储,指针存在栈内存中,指针指向的具体内容存储在堆内存
- 基本类型不能动态添加属性
栈内存和堆内存
放上《高程3》上的图。
基本类型的值复制:
引用类型的值复制:
先忽略复制后的变量对象,从图中可以看到基本类型和引用类型的存储方式。对于引用类型的那个图中,左边就是栈内存,右边是堆内存。基本类型直接将值存储在栈内存中,引用类型将指针存储在栈内存中。
然后在考虑一下复制问题,从图中可以看到:
- 基本类型的复制是另开一个空间,存储与被复制值相同的值
- 引用类型的复制也在栈内存中另开了一个空间,但两个对象的指针指向堆内存中的同一个值
深拷贝
由上面引用类型的复制问题可以知道,当obj2
中的值发生变化时,obj1
也会变化。因为obj2
值的变化实际上是堆内存中的对象发生变化,而obj1
和obj2
指向同一个对象,因此他们的变化是同步的。
let obj1= {
a:1, b:2};
let obj2 = obj1;
console.log(obj1) // {a: 1, b: 2}
console.log(obj2) // {a: 1, b: 2}
obj1.a = 2;
console.log(obj1) // {a: 2, b: 2}
console