在 JavaScript 中 , 我们可以分为两种类型:基本类型 和 引用类型。两者类型的区别就是:存储位置不一样。
数据类型
1、基本类型主要为6种:
- Number:整数或浮点数,还有-Infinity,Infinity,NaN
- String:一串表示文本的字符序列;字符串是不可变的,意思是一旦创建,它们的值就不能变了。
- Boolan: 类型有两个字面值: true 和 false。
- undefined: 只包含一个值undefined;当使用 var或 let声明了变量切没有初始化时,就相当于给变量赋予了 undefined值。
- null:只包含一个值null;表示一个空对象指针,这也是给 typeof 传一个 null 会返回 "Object" 的原因。
- symbol:是ES6新出的一种数据类型,这种数据类型的特点就是没有重复的数据,可以作为object的key。
数据的创建方法Symbol(),因为它的构造函数不够完整,所以不能使用new Symbol()创建数据。由于Symbol()创建数据具有唯一性,所以 Symbol() !== Symbol(), 同时使用Symbol数据作为key不能使用for获取到这个key,需要使用Object.getOwnPropertySymbols(obj)获得这个obj对象中key类型是Symbol的key值。
Symbol特点:
- Symbol的值是唯一的,用来解决命名冲突问题
- Symbol值不能与其他数据进行运算
- Symbol定义的对象属性不能使用for...in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名
2、引用类型(复杂数据类型) :
通常用Object代表,普通对象,数组,正则,日期,Math数学函数都属于Object。
3、其他引用类型
除了上述说的三种之外,还包括 Date、RegExp、Map、Set等.....
存储区别
1:基本数据类型和引用数据类型存储在内存中的位置不同:
当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值。
1、基本数据类型 存储在 栈 中 。
a 的值为一个基本类型,是存储在栈中,将 a 的值赋给 b,虽然两个变量的值相等,但是两个变量保存了两个不同的内存地址。
2、 引用类型 的对象存储于 堆 中。
引用类型数据存放在堆中,每个堆内存对象都有对应的引用地址指向它,引用地址存放在栈中。obj1 是一个引用类型,在赋值操作过程汇总,实际是将堆内存对象在栈内存的引用地址复制了一份给了 obj2,实际上他们共同指向了同一个堆内存对象,所以更改obj2会对obj1产生影响。