typeof null 竟等于 object ?typeof function 又等于 function ?JavaScript 这葫芦里卖的什么药
前言
我们知道目前在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 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