JS数据类型有哪些,区别是什么?看这篇就够了!

194 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

前言

本篇文章总结了面试中常问到的JS数据类型的题目,供大家参考学习,如有写的不准确的地方,欢迎掘友们提出issues,相互学习,共同进步!

一. 分类

1.类型分类

基本数据类型:Number,String,Boolean,BigInt,Symbol,Null,Undefined

引用数据类型:Object

注意:普通对象,数组,正则,日期,Math数学函数都属于Object

2.存储方式

基本数据类型:直接存储在栈中的简单数据,占据空间小,属于被频繁使用的数据

引用数据类型:存储在堆内存中,占据空间大。在栈中存储指针,指针指向堆中实体的起始位置,

当解释器寻找该引用值时,会检索其在栈中的地址,取得地址后从堆中获取实体

二. Symbol、BigInt、null 类型详细介绍

1.Symbol

Symbol是ES6新数据类型,特点是没有重复的数据,可以作为object的key

数据的创建方法为Symbol(),因为他的构造函数不够完整,所以不用使用new Symbol()创建数据

其特点唯一性,Symbol() !=Symbol(),它如果作为key是不能使用for来获取到的,需要使用Object.getOwnPropertySymbols(obj)获取这个obj对象中key类型是Symbol的key值

let key = Symbol('key');
let obj = { [key]: 'symbol' };
let keyArrary = Object.getOwnPropertySymbols(obj); //返回一个数组【Symbol)key)】
obj[keyArrary[0]]; //'symbol'

2.BigInt

2.BigInt也是ES6新数据类型,特点是数据涵盖范围大,能够解决超出普通数据范围报错的问题。

使用方法:

  • 整数末尾直接+n:647326483767797n
  • 调用BigInt()构造函数:BigInt("647326483767797")

注意:BigInt和Number之间不能进行混合操作

image.png

3.null

image.png

由上图可知:null 打印出来是object类型,为什么归类到基本类型呢?

引用类型的变量其实也是基本类型,而引用指向对象本身才是引用类型。null不指向任何变量,它是一个常量,所以说是基本类型。看不懂看如下解释:

null 其实属于自己的类型 Null,而不属于Object类型,typeof 之所以会判定为 Object 类型,是因为JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,因此,null 被误判断为 Object 类型。 对象被赋值了null 以后,对象对应的堆内存中的值就是游离状态了,GC 会择机回收该值并释放内存。因此,需要释放某个对象,就将变量设置为 null,即表示该对象已经被清空,目前无效状态。

原型链中 null是顶层原型的原型

image.png

三. Null 和 Undefined 的区别

null 是定义并赋值null,经常用作函数的参数,或作为原型链的重点

undefined是定义未赋值(变量提升时默认会赋值为undefined,函数参数未提供默认为undefined,函数的返回值默认为undefined)

1. undefined不是关键字,而null是关键字:

image.png

2. undefined和null被转换为布尔值的时候,都为false:

image.png

3. 使用Number()对undefined和null类型转换:

image.png

4.undefined是window的一个属性,null是一个对象类型:

image.png