我们都知道的js的数据类型分为普通类型和引用类型,我们分别从普通类型和引用类型来分别对应说明下js的数据类型,以及他们和堆栈的对应关系,下面来举例说明下。
基本类型
String、Number、null、Undefined、Boolean、以及ES6新增的Symbol表示独一无二的值
引用类型(引用类型的本质是由一组无序的键值对组成)
Object、Array、Function、Date、RegExp
-
我们来说下null和undefined的区别:
在if语句里面 null 和undefined 都会转为false两者用相等运算符也是相等,这里的”相等“指的是==,而非”===“ ,关于双等号和三等号的区别 我们下边再说。undefined代表的含义是未定义,定义了形参,没有传实参,显示undefined,一般变量声明了但还没有定义的时候会返回undefined,对象属性名不存在的时候,显示undefined,函数没有写返回值,即没有写return,拿到的是undefined,而null代表的含义是空对象,也做原型链的终点null主要赋值给一些可能会返回对象的变量,作为初始化 -
接上文我们顺便说一下==和===的区别,好像有点跑远了.....:
有很多同学应该没有考虑过==和===号到底有什么区别,话不多说直接上例子:
null == undefined 最终结果等于true 55 == '55' 最终结果等于true null === uundefined 最终结果等于false 55 === '55' 最终结果等于false通过上面的例子,不少聪明的同学已经大概看出他们的区别了,下面来详细解释下,==操作符会将两边的值进行强制转化再比较相等,而===操作符不会进行类型转换。而===操作符不仅要求值相等,还要求类型相同。!=和!==的区别当然也是类似,!=会做强制类型转换,而!==不会。所以我们了解了这两个运算符的区别可以在项目中根据需求灵活使用
-
接下来说一下数据类型存储以及堆栈内存:
基本类型数据是存储在于栈内存中,因为基本类型数据简单,占据空间小,大小固定,属于频繁使用的数据,并由系统自动分配和自动释放 ,引用数据类型同时存储于栈内存和堆内存,占据空间大,大小不固定,系统也不会自动释放,他会将数据的指针存在于栈中,将指针对应的值存在于堆内存中。当我们把对象赋值给另外一个变量时,复制的是对象的指针,指向同一块内存地址,意思是变量中保存的实际是一个指针,这个指针最终指向的实际的值最终是来源于堆内存中的,这里涉及到一个浅拷贝和深拷贝的知识点,我们下次有时间分享。
-
下面最后用简洁的语言来解释下什么是堆(heap)和栈(stack):
栈:是一种连续性存储的数据结构,具有先进后出的性质,打个比喻他好像一大摞盘子,每次都是取最上边的,每次也会把新盘子放最上面去,使用的是一级缓存 堆:是一种非连续性的树形存储结构,具有队列(Queue)优先,先进先出的特点,使用的是二级缓存
当然堆和栈的知识点并不是用这么简单的几句话就能完全解释,恕在下愚钝目前只了解这么多~