为什么typeof为null的“对象”?


241

我正在阅读“面向Web开发人员的专业Javascript”第4章,它告诉我五种原语是:未定义,空,布尔值,数字和字符串。

如果null是原始的,为什么还typeof(null)返回"object"

这是否意味着null通过引用传递(我假设此处所有对象都通过引用传递),因此使其不是原始类型?


50
答:因为规范是这样说的。通常认为这是一个错误。
SLaks

5
注意,typeof是一个运算符,而不是一个函数(实际上,您可以忽略它后面的括号),因此在这里讨论通过引用传递没有意义。实际上,“ JavaScript:优质零件”一书在附录A题为“糟糕的零件”的A.6节中提到了typeof null ==='object'的事实。
约翰·桑德森

5
我想我想读“可怕的部分”
哈哈

1
巨大的错误,深不可测!:)
亚历山大·米尔斯

2
那么,我们应该使用什么代替typeof来检查变量持有的值的类型呢?我很想知道两者之间的含义(布尔值,字符串,数字,数组,对象,函数,符号,空值,未定义,NaN)
Costa

Answers:


219

有关typeof操作员行为的MDN页面上

null

//自JavaScript诞生以来
typeof null ==='对象';

在JavaScript的第一个实现中,JavaScript值表示为类型标记和值。对象的类型标记为0。null表示为NULL指针(在大多数平台中为0x00)。因此,null具有0作为类型标记,因此typeof返回“对象” 值。(参考

提出了针对ECMAScript的修复程序(通过选择加入),但已被拒绝。它将导致typeof null === 'null'


137
这是一个耻辱,这个变化不是至少使它成为严格的模式...
英戈·伯克

人们一直在利用这个怪癖,如果没有被拒绝,那么很多代码都必须更改,我想
Cold Cerberus

对于少数希望通过这种方式更改代码的在世人士而言,这比其他开发人员在其余时间必须学习它更有意义。仅仅因为一个人还不存在,并不一定意味着他们无关紧要,而只是意味着他们没有防御能力。
Seph Reed

人们为什么总是将其用作null支票没有意义。这没有直觉,那么他们为什么要使用它呢?现在,由于编码错误,无法添加更改。
Emobe

69

如果null是原始的,为什么还typeof(null)返回"object"

因为规范是这样说的

11.4.3typeof操作

产生UnaryExpressiontypeof UnaryExpression的评估如下:

  1. val为评估UnaryExpression的结果。
  2. 如果Typeval)是Reference,则
       a。如果IsUnresolvableReferenceval)为true,则返回“ undefined”。
       b。令valGetValueval)。
  3. 根据表20 返回由Typeval)确定的字符串。

在此处输入图片说明


@peter不会typeof告诉您是否可以对某些对象调用方法。
马特·鲍尔

2
据我所知,你可以调用任何东西比其他方法nullundefined
马特·鲍尔

4
@peter,您不能在字符串基元上调用方法,但是幸运的是,当您使用带有属性的基元之一时,字符串基元(以及数字基元和布尔基元)会隐式地自动“自动装箱”在字符串,数字和布尔值包装器中参考运算符(.[ ])。
Pointy

28

正如已经指出的,规范是这样说的。但是,由于JavaScript的实现要早于ECMAScript规范的编写,并且该规范非常谨慎,因此不能纠正最初实现的缺点,因此仍然存在一个合理的问题,即为什么要首先采用这种方式。道格拉斯·克罗克福德(Douglas Crockford)称其为错误。Kiro Risk 认为这有点道理

null与之相对,其背后的原因是,与相比undefined,(并且仍然)经常在出现对象的地方使用。换句话说,null通常用于表示对对象的空引用。当布伦丹·艾希(Brendan Eich)创建JavaScript时,他遵循相同的范例,并且可以说返回“对象”是合理的(可以说)。实际上,ECMAScript规范将原始值定义null表示有意缺少任何对象值的原始值(ECMA-262,11.4.11)。


3
由于我现在找不到视频,因此我将其发布给好奇的人,没有任何参考:Crockford解释了解析null类型的零值如何指向types数组上的零索引元素,因此这很清楚发展中的bug,其中微软的家伙反编译和重新编译为JS浏览器时意外地传播
阿克塞尔科斯塔斯·佩纳

6

摘自《YDKJS》

这是JS中一个长期存在的错误,但可能永远都不会修复。Web上太多的代码依赖于该错误,因此对其进行修复将导致更多的错误!


1
不要相信一切都写在一本书中。我真的很喜欢那本书,但是,我不能认为这是一个错误,因为ECMA JavaScript规范规定null类型必须是一个对象。
andreasonny83 '18

4

如果null是原始的,为什么还typeof(null)返回“ object”?

简而言之:这是ECMAScript中的错误,类型应为 null

参考:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/null


1
您的参考资料中没有任何地方声明这是一个错误。
user2867288 '17

1
规范中没有任何地方说typeof应该返回“ undefined”,“ object”,“ boolean”,“ number”,“ string”,“ function”和“ symbol”之外的任何内容(ECMAScript 2015)
Brad Kent

1

在JavaScript中,null为“ nothing”。它应该是不存在的东西。不幸的是,在JavaScript中,null的数据类型是一个对象。您可以认为typeof null是对象是JavaScript中的错误。它应该为空。


0

在JavaScript中,typeof null为'object',错误地表明null为对象。这是一个错误,很遗憾无法修复,因为它会破坏现有代码。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.