为什么是typeof null“object”?
我正在阅读“Web开发人员的专业Javascript”第4章,它告诉我五种基本types是:undefined,null,boolean,number和string。
如果null
是一个基元,为什么typeof(null)
返回"object"
?
这不意味着null
通过引用传递(我假设所有对象都是通过引用传递的),因此使它不是原始的?
在JavaScript的第一个实现中,JavaScript值被表示为types标记和值,对象的types标记为0
, null
表示为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
生产UnaryExpression :
typeof
UnaryExpression的计算方法如下:
- 让val是评估UnaryExpression的结果。
- 如果types ( val )是引用 ,那么
一个。 如果IsUnresolvableReference ( val )为true ,则返回“undefined
”。
湾 让val是GetValue ( val )。- 根据表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,因此修复它会导致更多的错误!