javaScript-数据类型的检测

2021-03-20·3min
type
Post
summary
status
Published
category
tags
slug
date
Mar 20, 2021
password
icon
📌
在深入了解JS数据类型的检测之前,首先要知道JS有几种数据类型。
大致可以分为两类:
- 基础数据类型
  • string
  • number
  • boolean
  • null
  • undefined
  • symbol
  • bigint
- 引用数据类型
  • 对象Object (包括普通对象Object,数组对象Array,正则对象RegExp,日期对象Date,数学函数Math,函数对象Function)

typeof

在JS中,我们一般使用typeof来检测基础数据类型。
typeof是一个操作符,当用它来检测一个变量的数据类型时,会返回这个变量的数据类型的字符串表示。
用法如下:
可以看到,在检测基础数据类型时,除了null的检测有误(检测成object)外,其他的检测都正常显示正确的类型。
但对于引用数据类型,除了function会显示正确的类型,其他引用类型都会显示为object。
那为什么null会被检测为object呢?
要研究这个问题,就得看看typeof的工作原理了。

typeof的工作原理

其实原理很简单。
首先要知道,JS的数据在底层都会被解析为二进制。
typeof就是根据解析后的二进制数据的前三位来进行数据类型的检测。
对象object的前三位为000,null的二进制全是0,所以null会被错误检测为object。

一些思考

null是对象吗?

首先肯定的是,null不是一个对象。
虽然typeof null会显示object,但这是一个bug。

null和undefined的区别

具体可参考:
在此引用简单的结论:
null表示"没有对象",即该处不应该有值。
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。

instanceof

因为typeof检测引用数据类型不可靠,所以一般使用instanceof来检测引用数据类型。
instanceof的工作原理是检测某个实例对象的原型链上是否存在某个构造函数的prototype。
简单来说就是基于原型链的查询。
使用方法如下:
但instanceof也有弊端,由于是基于原型链的查找,所以只要在原型链上就会返回true,这种不唯一的结果并不准确。

手写instanceof

更好的数据检测方法

Object.prototype.toString.call()
使用方法如下:
这里值得注意的是,这里为什么要使用顶级原型Object上的toString方法呢?
由于很多对象类型,例如数组,函数等都重写了toString方法,调用这些方法仅仅会返回该对象的字符串形式。
而顶级原型Object上的toString方法会返回调用它的对象所属的类的信息。

参考文章

> cd ..