今日题目:

你可以系统说说JS中都有哪些数据类型吗?

题目解析:

答:

JS中数据类型一共有九个,我们可以按照其特点分为两大类:

  1. 基础数据类型
  2. 引用数据类型

第一类「基础数据类型」,又叫原始类型或值类型,包含有number、string、boolean、undefined、null、es6提出的symbol和ES2020新提案加入的bigint这七个类型。

第二类「引用数据类型」,有object和function这两个具体类型。

在es中,每一种数据类型都有自己具体的值:
对于数字类型,除了我们平常使用的正常的数字1、2、3以外,还有NaN和Infinity正负无穷等;
而我们平时代码中,只要使用单引号、双引号或模版字符串等包裹起来的都是字符串string类型;
boolean类型比较简单,就只有有true和false两个值;
null和undefined类型的值比较特殊,他们的值就是本身;
Symbol函数执行即可得到symbol类型的值,每个symbol值他们都是唯一不重复的;
bigint的值有个特点就是正/负整数后边加一个n;
object类型的具体值除了我们常写的普通对象以外,Array数组、RegExp正则、Date日期、Error错误、Json、Set、Map等也都是object类型;
而对于比较特殊的函数,他虽然也是对象,但是他的类型可以单独从对象中划分出来为function类型。除了常写的普通函数以外,ES中还包括构造函数、箭头函数、生成器函数等。

不同类型的值在计算机中存储的位置也不同:
其中,基本数据类型的具体值存储在栈内存中;引用数据类型的值存储在堆内存中,并且同时在栈内存中存储指向该堆内存的地址。

扩展延伸:

1、null和undefined

对于null和undefined这两个类型,他们就比较特殊。他们一个表示空,一个表示未定义。
二者都是原始值,类型下只有一个值就是自己本身,也就是说null的值就是null,undefined的值就是undefined,再无其他。
另外,二者都没有属性和方法。这是因为undefined和null不可以有属性,因为二者就是最原始的原始值,二者都没有原型,也就不可能有属性和方法,更不可能经过包装类,固然也不能使用像toString这种挂载在原型链上的方法了。

但是调用字符串等值身上不存在的属性时就不会报错,这是因为string、number、boolean这三个会类型的值会经过包装类,所以还可以添加、获取值身上的属性。
如下图:获取number、string、boolean身上的属性不会报错,但是null和undefined的就会报错Cannot read property xxx of null/undefined
image.png

一般遇到这种问题,我们就能很快定位并解决,原因是调用报错中引号包裹的属性(如上图中的’proto‘)的变量是一个null/undefined。

2、堆栈内存和值拷贝

基本数据类型的具体值存储在栈内存中;引用数据类型的值存储在堆内存中,并且同时在栈内存中存储指向该堆内存的地址。
所以当我们拷贝一个引用类型变量值后再进行修改,两个变量都会修改。
而原始类型的值是不能修改的,我们平时给变量的重新赋值操作并没有修改原始值,而是会让引擎在内存中重新开辟一个栈内存空间,并将新值存入,之前的值所占内存因为不再使用,后期会被回收。

撰写人:小石头