JavaScript底层运行机制系列(一) - 数据类型分类和检测

377 阅读2分钟

初探JavaScript的童鞋们,肯定从基础数据类型开始研究,对于我们JavaScript的数据类型信手拈来,而且面试官也会经常问,请你说说JavaScript中的数据类型?

  • 基础数据类型
  • 复杂数据类型

基础数据类型

  • undefined:undefined
  • null:null
  • boolean:false
  • number:1NaN(可以用isNaN来检测,返回boolean,也可以用Object.is()来检测两个NaN,结果返回true,因为is方法再内部做了处理,只是检测值,不会做隐式转换。)、Infinity
  • string:'1'
  • symbol:Symbol(1),可用作对象的唯一属性,可用Object.getOwnPropertySymbols()获取到值。可用于宏观唯一标识处理底层原理应用
  • bigint:1000n
  • ...

复杂数据类型

标准普通对象

  • Object普通对象:{}

标准特殊对象

  • Array数组对象
  • RegExp正则对象
  • Date日期对象
  • Error错误对象
  • Set/Map
  • Math数学对象
  • JSON对象
  • ArrayBuffer DataView
  • function* num(){}
  • Promise Proxy Reflect
  • ...

可调用对象

  • Function

非标准特殊对象

  • Number
  • String
  • Boolean
  • Symbol
  • Bigint
  • ...

咳咳~当然面试官不需要你说这么多,你只需要知道七大简单与一大object就行了,

创建变量的方式

字面量方式

let n = '1'
// typeof n => 'string'

构造函数方式

let n = new String(1);
// typeof n = 'object'

包装对象方式

String(1)
// typeof n = 'string'

检测机制typeof

ECMAScript提供的内置类型在计算机底层都是以二进制数据存储的,那么我们typeof的检测机制自然也是如此

演示

image.png

先来说说typeof的局限性,我们看到typeof {}typeof []他们都是一个object,在实际开发中我们需要准确拿到类型值,故而typeof检测是有弊病的,另外typeof null是一个object这是一个bug,今天我们就来说一说为何如此,原来用typeof检测数据,会调用内部方法Getvalue方法,按照计算机数据存储方式检测的。

计算机底层数据存储

ECMAScript规定在计算机内存中

  • 1:整数数字
  • 010:浮点数
  • 100:字符串
  • 110:布尔
  • -2^30undefined
  • 000000null
  • 000:对象 根据上面所说,typeof检测null的时候,会把000当做对象处理,故而有typeof null"object"
  • 如果是检测可调用对象,则返回'function',因为在检测的时候会去检测有没有实现call方法,有call则是'function',没有则是'object'
  • 如果检测未被定义的变量,则不会报错。 回到上一个问题,我要准确拿到某个变量的准确类型,typeof明显是不合适的,基于这个我们还有
    • instanceof
    • constructor
    • Object.prototype.toString.call()

等等之类的检测方法,这里暂且不谈。

数据类型与堆栈内存的关系

image.png