为什么是typeof null“object”?

我正在阅读“Web开发人员的专业Javascript”第4章,它告诉我五种基本types是:undefined,null,boolean,number和string。

如果null是一个基元,为什么typeof(null)返回"object"

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

在JavaScript的第一个实现中,JavaScript值被表示为types标记和值,对象的types标记为0null表示为NULL指针(在大多数平台上为0x00 )。 结果,null有0作为types标记,因此是返回值( 引用 )的伪造types。

  typeof null === 'object'; // This stands since the beginning of JavaScript 

ECMAScript提出了一个“修复”(通过selectjoin)。 这将导致:

 typeof null === 'null' 

…但是这个改变被拒绝了 ,因为使用这个特定的“quirk”来testingnull代码的问题。

如果null是一个基元,为什么typeof(null)返回"object"

因为规范是这样说的 。

11.4.3操作员的types

生产UnaryExpressiontypeof UnaryExpression的计算方法如下:

  1. val是评估UnaryExpression的结果。
  2. 如果types ( val )是引用 ,那么
    一个。 如果IsUnresolvableReference ( val )为true ,则返回“ undefined ”。
    湾 让val是GetValue ( val )。
  3. 根据表20返回Type ( val )确定的string。

在这里输入图像描述

正如已经指出的那样,规范是这样说的。 但是,由于JavaScript的实现早于ECMAScript规范的编写,并且规范非常小心,不能纠正最初实现的缺陷,所以仍然存在一个合理的问题,即为什么要这样做。 道格拉斯·克罗克福德称这是一个错误 。 基罗风险认为这挺有意义的 :

这背后的原因是null ,与undefined相比,在对象出现的时候经常使用(并且仍然是)。 换句话说, null通常用于表示对对象的空引用。 当Brendan Eich创buildJavaScript时,他遵循相同的范式,并且有理由(可以说)返回“对象”。 实际上,ECMAScript规范将null定义为表示故意不存在任何对象值的原始值 (ECMA-262,11.4.11)。

如果null是一个基元,为什么typeof(null)返回“ object ”?

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

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

从书YDKJS

这是JS中一个长期存在的bug,但可能永远不会被修复。 网上的代码过多依赖于这个bug,因此修复它会导致更多的错误!