我正在阅读“专业Web开发者Javascript”第4章,它告诉我五种类型的原语是:未定义,null,布尔,数字和字符串。

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

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


当前回答

来自YDKJS这本书

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

其他回答

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

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

因为规范是这么说的。

11.4.3 typeof操作符 生成的UnaryExpression: typeof UnaryExpression的计算如下: 设val为对UnaryExpression求值的结果。 如果Type(val)是Reference,则 a.如果IsUnresolvableReference(val)为真,返回"undefined"。 b.设val为GetValue(val)。 返回一个由Type(val)根据表20确定的字符串。

这是javascript第一版遗留下来的bug。

“这是一个错误,不幸的是无法修复,因为它会破坏现有的代码。”

参考和更多信息:https://2ality.com/2013/10/typeof-null.html

来自MDN页面关于typeof操作符的行为:

零 //这是从JavaScript开始的 Typeof null === 'object'; 在JavaScript的第一个实现中,JavaScript值被表示为一个类型标签和一个值。对象的类型标记为0。null表示为null指针(在大多数平台中为0x00)。因此,null以0作为类型标记,因此返回值为“object”类型。(参考) 针对ECMAScript提出了一个修正(通过选择加入),但被拒绝了。这将导致typeof null === 'null'。

正如已经指出的,规范是这么说的。但是,由于JavaScript的实现早于ECMAScript规范的编写,并且该规范小心翼翼地没有纠正最初实现的缺点,因此仍然存在一个合理的问题,即为什么要以这种方式完成。道格拉斯·克罗克福德称这是一个错误。Kiro Risk认为这是有道理的:

这背后的原因是,与undefined相比,null在对象出现的地方经常被使用(现在仍然是)。换句话说,null通常用于表示对对象的空引用。当Brendan Eich创建JavaScript时,他遵循了同样的范式,返回“object”是有意义的(可以说)。事实上,ECMAScript规范将null定义为表示有意缺少任何对象值的原语值(ECMA-262, 11.4.11)。