原始类型:
- Boolean
- Number
- String
- Null
- Undefined
- Symbol(ES6新增)
复杂数据类型:
- Object
ES10新增了一种基本数据类型: BigInt
- null是不是对象?
null不是一个对象,尽管 typeof null === “object”, 这是一个历史遗留问题,原理是不同的对象在底层都是用二进制来表示的,在js中二进制前三位是0既判断为对象,null的二进制表示全是0,即前三位都是0,所以执行typeof(null)的时候返回object,实际上null是基本数据类型。
基本数据类型和复杂数据类型的区别:
- 内存分配不同
基本数据类型存储在栈中。
复杂数据类型存储在堆中,栈中存储的地址,是指向堆中的引用地址,属性及值存储在堆中。
- 访问机制不同
基本数据类型是按值访问
复杂数据类型是按引用访问,JS不允许直接访问保存在堆内存中的对象,在访问一个对象时,首先得到的是这个对象在栈内存中的地址,然后按照这个地址去获得存储在堆中的值。
基本数据类型作为参数时,修改基本数据类型的参数不影响原有数据,复杂数据类型,是通过引用地址来访问的,所以作为参数时,修改属性后,会影响原有数据。