为什么 typeof 为空“对象”?

IT技术 javascript primitive
2021-01-10 18:23:19

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

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

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

6个回答

关于typeof操作员行为的 MDN 页面

null

// 这从 JavaScript 开始就存在
typeof null === '对象';

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

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

无论如何人们会将此用作空检查是没有意义的。它没有直观的意义,那么他们为什么要使用它?现在由于编码错误,无法添加更改。
2021-03-14 18:23:19
遗憾的是,此更改至少没有使其进入严格模式......
2021-03-27 18:23:19
对于少数想要更改代码的活着的人来说,比其他开发人员在剩下的时间里必须学习它更有意义。仅仅因为一个人还不存在,并不一定意味着他们不重要,这只是意味着他们手无寸铁。
2021-03-27 18:23:19
人们一直在利用这个怪癖,如果没有被拒绝,许多代码将不得不更改,我猜
2021-03-29 18:23:19

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

因为规范是这么说的

11.4.3typeof操作

产生式UnaryExpression : typeof UnaryExpression的计算方式如下:

  1. val为评估UnaryExpression的结果
  2. 如果Type ( val ) 是Reference,则
       a. 如果IsUnresolvableReference ( val ) 为,则返回“ undefined”。
       湾 valGetValue ( val )。
  3. 根据表 20返回由类型( val )确定的字符串

在此处输入图片说明

@peter 您不能在字符串基元上调用方法,但幸运的是,当您使用具有属性的基元之一时,字符串基元(以及数字基元和布尔基元)在字符串、数字和布尔包装器中隐式并自动“自动装箱”引用运算符(.[ ])。
2021-03-13 18:23:19
据我所知,您可以调用除nulland以外的任何方法undefined
2021-03-22 18:23:19
@petertypeof没有告诉您是否可以对某事调用方法。
2021-03-25 18:23:19

正如已经指出的那样,规范是这样说的。但是由于 JavaScript 的实现早于 ECMAScript 规范的编写,并且规范小心翼翼地不纠正初始实现的弱点,所以仍然存在一个合理的问题,即为什么首先要这样做。道格拉斯·克罗克福德称这是一个错误Kiro Risk认为这有点道理

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

由于我现在找不到视频,我将发布此视频仅供好奇的人使用,没有任何参考:Crockford 解释了解析 null 类型的零值如何指向类型数组上的零索引元素,所以这是一个明确的开发微软人在为他们的浏览器反编译和重新编译 JS 时不小心传播的错误
2021-03-27 18:23:19

来自YDKJS一书

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

@andreasonny83这篇博文解释了为什么它是一个错误。事实上,该规范规定,typeof null就是object简单的说就是规范选择合并的bug作为规范的一部分。无论如何,这就是为什么我确实认为这是一个错误。:)
2021-03-22 18:23:19
布兰登·艾克解释了为什么它是故意的。typeof null === "object"不是错误,而是必须适应 Java 互操作性的二阶效应。
2021-04-05 18:23:19
不要相信一切都写在书里。我真的很喜欢那本书,但是,我不能认为这是一个错误,因为 JavaScript 的 ECMA 规范规定 null 的类型必须是一个对象。
2021-04-07 18:23:19

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

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

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

您的参考资料中没有任何地方说明这是一个错误。
2021-03-13 18:23:19
规范中没有任何地方说 typeof 应该返回除“未定义”、“对象”、“布尔值”、“数字”、“字符串”、“函数”和“符号”之外的任何内容(ECMAScript 2015)
2021-03-23 18:23:19