为什么 typeof(null) 返回 "object",但是你不能给它赋属性?

4

请耐心等待,我将尝试解释一个奇怪的问题。

在控制台中评估 typeof(null)时,返回了"object",因此按理说,应该可以为其分配属性,但是null.foo = 42会导致TypeError: Cannot set property 'foo' of null错误。

Javascript只对哪些全局对象是可变的有所挑剔吗?


3
可能是为什么null是一个对象,null和undefined之间有什么区别?的重复问题。 - Niet the Dark Absol
3个回答

11

这个页面对于为什么typeof(null)返回“object”的历史背景有一个很好的描述:
JS 数据类型 - Null

以下是相关部分(建议阅读整篇文章):

typeof null === "object"; // true
为什么typeof null返回"object"呢?
// 发生了什么?

答案可能会让一些人失望,但事实上只是因为上表要求这样做。

这背后的原因是,与undefined相比,null通常用于出现对象的位置。换句话说,null经常用来表示对对象的空引用。当 Brendan Eich 创建 JavaScript 时,他遵循了相同的范例,返回"object"是合理的(可以这么说)。实际上,ECMAScript 规范将null定义为表示没有任何对象值的意图缺失的原始值(ECMA-262, 11.4.11)。

要进行类比,考虑typeof(NaN) === "number"。那么为什么JavaScript将“number”作为NaN(非数字)的类型呢?这是因为NaN用于出现数字的位置,它是一个表示有意缺少数字值的值。类似的推理适用于null,唯一的区别是null被实现为原始值,而NaN实际上被实现为Number对象(因此NaN.foo = 42实际上有效)。


我从中得出的结论是,null 是一个空引用,但它仍然是一个引用。这是否是从 Eich 所遵循的范例中得出的合理理由?同样地,我认为 undefined 只是一个不存在的引用。我在这条路上走得对吗? - Bucket
@DesertIvy,你可以将null视为一个空引用,但我实际上会尽量避免使用“引用”这个词,因为它在不同的人中有不同的含义,具体取决于他们喜欢的编程语言,这可能会导致混淆。我更喜欢"null是表示对象不存在的原始值"。 - Andrew Clark
有道理。回到你答案中引用的文档中的斜体文本,似乎“有意的”这个词对这种情况非常相关。 - Bucket

3
规范规定 typeof 返回值为 "object",对于 null 值,同时null 定义为原始值

原始值是以下内置类型之一的成员:Undefined、Null、Boolean、Number 和 String;对象是其余内置类型 Object 的成员;而函数是可调用对象。

因此,null 不是一个对象。这就是为什么你无法为它分配属性的原因。typeof 返回的值是人为设定的。

4.3.11中可以得知,null是一种原始值,代表着有意的缺少任何对象值。而对于"null is not an object"这个明确的声明,我们应该给予肯定的评价。 - Blue Skies
有趣的回答。typeof 返回这样一个值是否有固有优势? typeof(undefined) 确实返回 undefined,那么为什么 typeof(null) 不会类似地返回 null 呢? - Bucket
@DesertIvy 抱歉晚了一步看到你的评论... F.J的回答已经很好地解释了背后的原理,你现在可能已经知道了。 - bfavaretto

-1

null是一种原始数据类型。它只有一个值:null。它没有构造函数。它是语言内置的对象。换句话说,您无法创建null类型的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接