在
JavaScript
中,我们经常用typeof
运算符来判断一个值的类型,但是有一个特殊的情况,就是当我们对null
值使用typeof
时,会得到一个意想不到的结果:"object"
。这是为什么呢?
null
不是一个对象,只是一个表示"没有值"的特殊值,在印象中,只有引用类型通过typeof
判断才会是object
。而null
100% 是一个基本类型,并不是引用类型。
那typeof null
为什么是object
呢。
本文将从JavaScript
的历史、内部实现、规范等方面,深入探讨这个问题的原因和影响,以及如何正确地判断null
值。
要理解typeof null
为什么会返回"object"
,我们需要回顾一下JavaScript
的历史。
JavaScript
最早是由网景公司(Netscape)
的布兰登·艾克(Brendan Eich)
在1995年设计和实现的一种浏览器端的脚本语言,当时它被命名为LiveScript
。后来为了借助Java
语言的流行度,网景公司将其改名为JavaScript
,并与1996年推出了第一版。
当时的JavaScript
是一种非常简单的语言,只有几种基本类型,包括数字(number)
、字符串(string)
、布尔值(boolean)
、对象(object)
、函数(function)
和未定义(undefined)
。
其中,对象是一种复合类型,可以用来表示数组、日期、正则表达式等。函数也被视为一种对象,因为它可以有属性和方法。而null
是一种特殊的值,用来表示"没有对象"。
为了表示不同类型的值,JavaScript
在内部使用了一种称为"类型标签"的机制,用来区分不同类型的值。
而null
值在内部被表示为一个空指针(NULL pointer)
,也就是全零的二进制数:00000000。这样做有一个好处,就是可以节省内存空间,因为null
值不需要存储任何数据。
当我们使用typeof
运算符来判断一个值的类型时,JavaScript
会先检查这个值是否有类型标签。如果有,就根据类型标签返回相应的字符串。例如:
jstypeof 42; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof {}; // "object"
typeof function() {}; // "function"
typeof undefined; // "undefined"
但是如果这个值没有类型标签,就说明它是一个空指针。那么JavaScript
会怎么处理呢?这就涉及到一个历史遗留问题。
当布兰登·艾克设计JavaScript
时,他并没有考虑到null
值和对象类型之间可能存在冲突。他只是简单地认为null
值表示"没有对象",而对象类型表示"有对象"。所以他没有给null
值分配一个独立的类型标签,而是直接用空指针来表示。
但是这样做有一个问题,就是当我们对null
值使用typeof
时,JavaScript
会误认为它是一个对象类型。因为对象类型的标签是0,而空指针都是0。所以JavaScript
会直接返回"object"
。例如:
jstypeof null; // "object"
这就是为什么typeof null
会返回"object"
的原因。这是一个历史遗留问题,也是一个设计错误。但是由于JavaScript
已经广泛流行,要改变这个问题的代价太大,所以只能保留下来,作为一个"特例"来处理。
typeof null
返回"object"
的问题,虽然不会影响null
值本身的行为,但是会给我们判断null
值带来一些困难。例如,如果我们想要检查一个变量是否为null
,我们不能直接用typeof
运算符,而要用另外一些方法。
一种方法是用全等运算符(===)
来比较变量和null
值。全等运算符不会进行类型转换,所以可以准确地判断两个值是否相同。例如:
jsvar a = null;
a === null; // true
另一种方法是用instanceof
运算符来判断变量是否为null
。instanceof
运算符可以检查一个值是否属于某个对象的实例。而null
值不属于任何对象的实例,所以可以用它来排除null
值。例如:
jsvar a = null;
a instanceof Object; // false
typeof null
返回"object"
是JavaScript
的一个历史遗留问题,也是一个设计错误。
它是由于JavaScript
在内部使用类型标签来区分不同类型的值,而null
值被表示为一个空指针,导致与对象类型的标签冲突。
这个问题无法改变,只能作为一个"特例"来处理。我们需要注意这个问题,避免在判断null
值时出现错误或混淆。我们可以用全等运算符或instanceof
运算符来正确地判断null
值。
本文作者:CreatorRay
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!