编辑
2023-07-12
JS基础
00
请注意,本文编写于 498 天前,最后修改于 483 天前,其中某些信息可能已经过时。

目录

JavaScript的历史
JavaScript的内部实现
typeof运算符的工作原理
JavaScript的历史遗留问题
typeof null的影响和解决方法
总结

JavaScript中,我们经常用typeof运算符来判断一个值的类型,但是有一个特殊的情况,就是当我们对null值使用typeof时,会得到一个意想不到的结果:"object"。这是为什么呢?

null不是一个对象,只是一个表示"没有值"的特殊值,在印象中,只有引用类型通过typeof判断才会是object。而null 100% 是一个基本类型,并不是引用类型。

typeof null为什么是object呢。

本文将从JavaScript的历史、内部实现、规范等方面,深入探讨这个问题的原因和影响,以及如何正确地判断null值。

JavaScript的历史

要理解typeof null为什么会返回"object",我们需要回顾一下JavaScript的历史。

JavaScript最早是由网景公司(Netscape)的布兰登·艾克(Brendan Eich)在1995年设计和实现的一种浏览器端的脚本语言,当时它被命名为LiveScript。后来为了借助Java语言的流行度,网景公司将其改名为JavaScript,并与1996年推出了第一版。

当时的JavaScript是一种非常简单的语言,只有几种基本类型,包括数字(number)、字符串(string)、布尔值(boolean)、对象(object)、函数(function)和未定义(undefined)

其中,对象是一种复合类型,可以用来表示数组、日期、正则表达式等。函数也被视为一种对象,因为它可以有属性和方法。而null是一种特殊的值,用来表示"没有对象"。

JavaScript的内部实现

为了表示不同类型的值,JavaScript在内部使用了一种称为"类型标签"的机制,用来区分不同类型的值。

null值在内部被表示为一个空指针(NULL pointer),也就是全零的二进制数:00000000。这样做有一个好处,就是可以节省内存空间,因为null值不需要存储任何数据。

typeof运算符的工作原理

当我们使用typeof运算符来判断一个值的类型时,JavaScript会先检查这个值是否有类型标签。如果有,就根据类型标签返回相应的字符串。例如:

js
typeof 42; // "number" typeof "hello"; // "string" typeof true; // "boolean" typeof {}; // "object" typeof function() {}; // "function" typeof undefined; // "undefined"

但是如果这个值没有类型标签,就说明它是一个空指针。那么JavaScript会怎么处理呢?这就涉及到一个历史遗留问题。

JavaScript的历史遗留问题

当布兰登·艾克设计JavaScript时,他并没有考虑到null值和对象类型之间可能存在冲突。他只是简单地认为null值表示"没有对象",而对象类型表示"有对象"。所以他没有给null值分配一个独立的类型标签,而是直接用空指针来表示。

但是这样做有一个问题,就是当我们对null值使用typeof时,JavaScript会误认为它是一个对象类型。因为对象类型的标签是0,而空指针都是0。所以JavaScript会直接返回"object"。例如:

js
typeof null; // "object"

这就是为什么typeof null会返回"object"的原因。这是一个历史遗留问题,也是一个设计错误。但是由于JavaScript已经广泛流行,要改变这个问题的代价太大,所以只能保留下来,作为一个"特例"来处理。

typeof null的影响和解决方法

typeof null返回"object"的问题,虽然不会影响null值本身的行为,但是会给我们判断null值带来一些困难。例如,如果我们想要检查一个变量是否为null,我们不能直接用typeof运算符,而要用另外一些方法。

一种方法是用全等运算符(===)来比较变量和null值。全等运算符不会进行类型转换,所以可以准确地判断两个值是否相同。例如:

js
var a = null; a === null; // true

另一种方法是用instanceof运算符来判断变量是否为nullinstanceof运算符可以检查一个值是否属于某个对象的实例。而null值不属于任何对象的实例,所以可以用它来排除null值。例如:

js
var a = null; a instanceof Object; // false

总结

typeof null返回"object"JavaScript的一个历史遗留问题,也是一个设计错误。

它是由于JavaScript在内部使用类型标签来区分不同类型的值,而null值被表示为一个空指针,导致与对象类型的标签冲突。

这个问题无法改变,只能作为一个"特例"来处理。我们需要注意这个问题,避免在判断null值时出现错误或混淆。我们可以用全等运算符或instanceof运算符来正确地判断null值。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:CreatorRay

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!