likes
comments
collection
share

typeof null 竟等于 object ?typeof function 又等于 function ?JavaScript 这葫芦里卖的什么药

作者站长头像
站长
· 阅读数 22

前言

我们知道目前在JavaScript中一共有八种数据类型

在JavaScript这门语言中有一个判断类型的内置函数typeof用于判断数据是什么类型的

但是typeof null却是object, typeof function又等于function这里就很奇怪了

本文就聊聊这其中故事

typeof null === object

这其实是一个历史遗留的问题,按理来说其实null作为基本数据类型不应该返回一个object的

为什么会出现这种情况呢?

在 JavaScript 最初的实现中,typeof 的返回值是基于表示值的机器码类型来决定的

机器码:

  • 000:表示对象,数据是对象的引用。
  • 1:表示整型,数据是 31 位带符号整数。
  • 010:表示双精度类型,数据是双精度数字。
  • 100:表示字符串,数据是字符串。
  • 110:表示布尔类型,数据是布尔值。

而 null 的所有 32 位机器码均为 0,这恰好与对象的类型标志位 000 相匹配。由于这个历史原因,当使用 typeof 操作符判断 null 时,就会返回 object 。

你说官方能改吗?当然能改

但是这里就是有一个问题,在这个问题出现的时候,JavaScript已经在全国 范围使用,开发了不计其数的项目了,如果这个东西改了,那么意味着现在所有的用JavaScript开发的项目都需要修改

举个例子,假设早期有一个大型的网站,其代码中广泛使用了 typeof null === 'object' 这种判断逻辑,如果突然改变这个行为,那么这个网站的相关功能可能就会出错,导致严重的业务影响。

所以JavaScript官方就没有去做修改,这个问题也就一直到了现在

这也就是为什么以下代码会出现这个结果

let s = '123'   // string
let n = 123    // number
let f = true   // boolean
let u = undefined   // undefined
let nu = null    // null
let sy = Symbol(123)   // Symbol
let big = 1234n    // BigInt


let obj = {}
let arr = []
let fn = function () { }
let date = new Date()

console.log(typeof s,"string");
console.log(typeof n, "number");
console.log(typeof f, "boolean");
console.log(typeof u, "undefined");
console.log(typeof nu, "null");
console.log(typeof sy, "symbol");
console.log(typeof big, "bigint");

console.log(typeof obj, "object");
console.log(typeof arr, "array");
console.log(typeof fn, "function");
console.log(typeof date, "date");

执行结果为

typeof null 竟等于 object ?typeof function 又等于 function ?JavaScript 这葫芦里卖的什么药

typeof function === function

我们知道typeof除了判断基本类型的null会出现bug之外,在判断对象类型的时候,如果是一个function的话,会显示数据类型为function,这又是为什么呢?

function本身就是一个对象

但是由于function在JavaScript中的地位是很特殊的

这样设计的原因主要是为了突出函数在 JavaScript 中的重要性和特殊性质

函数具有可执行的特性,能够被调用以执行特定的任务。它可以拥有属性,也可以作为参数传递给其他函数或被其他函数返回

那么typeof function === object吗?

其实是正确的

函数也是对象,函数既具有对象的特性,同时又被 typeof 操作符单独归类为 function 类型

总结

本文讲解了内置函数typeof的使用方式以及注意事项

typeof null === object和typeof function === function的具体原因

希望对你能够有所帮助!!!!!

转载自:https://juejin.cn/post/7392527720817704996
评论
请登录