一篇文章带你看懂typeof原理

前言

无意中刷到了一道有关 typeof 原理的大厂面试题,看到这道面试题的我,竟然毫无头绪。但是热爱学习的我并没有被这厮吓跑,赶紧打开书籍查看相关资料,并为大家整理了一些知识点,希望可以帮助到大家。

回顾JS的数据类型

我们先来回顾一下ECMAScript6 标准的 7 种数据类型:

  • String
  • Number
  • Object
  • Boolean
  • Undefined
  • Null
  • Symbol
什么是typeof操作符

鉴于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据结构。typeof 就是负责这方便信息的操作符。
节选自《JavaScript高级程序设计第三版》

对于一个值使用 typeof 操作符,可能返回下列某个字符串:

1
2
3
4
5
6
“undefined” ——  如果这个值没有被定义
“boolean” —— 如果这个值是布尔值
“string” —— 如果这个值是字符串
“number” —— 如果这个值是数值
“object” —— 如果这个值是对象或者null
“function” —— 如果这个值是函数

看到这里,小伙伴可能就会有些困惑了,在 JS 中,NullObject 是 2 种数据类型,但是 typeof 却统一认为都是 Object,这是为什么呢?在阅读书籍中,我发现在《你不知道的JavaScript(上卷)》中提到了以下内容:

原理是这样的: 不同的对象在底层都表示为二进制,在 JavaScript 中二进制前三位都为 0 的话会被判断为 object 类型,null的二进制表示是全 0,自然前三位也是 0,所以执行 typeof 时会返回“object”。

如何区分 Object 和 Null 类型

因为 typeof 无法区分这 2 种类型,所以我们可以采用 instanceof 来区分。