请耐心等待,我将尝试解释一个奇怪的问题。
在控制台中评估 typeof(null)
时,返回了"object"
,因此按理说,应该可以为其分配属性,但是null.foo = 42
会导致TypeError: Cannot set property 'foo' of null
错误。
Javascript只对哪些全局对象是可变的有所挑剔吗?
请耐心等待,我将尝试解释一个奇怪的问题。
在控制台中评估 typeof(null)
时,返回了"object"
,因此按理说,应该可以为其分配属性,但是null.foo = 42
会导致TypeError: Cannot set property 'foo' of null
错误。
Javascript只对哪些全局对象是可变的有所挑剔吗?
这个页面对于为什么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
只是一个不存在的引用。我在这条路上走得对吗? - Bucketnull
视为一个空引用,但我实际上会尽量避免使用“引用”这个词,因为它在不同的人中有不同的含义,具体取决于他们喜欢的编程语言,这可能会导致混淆。我更喜欢"null
是表示对象不存在的原始值"。 - Andrew Clarktypeof
返回值为 "object"
,对于 null
值,同时将 null
定义为原始值:
因此,原始值是以下内置类型之一的成员:Undefined、Null、Boolean、Number 和 String;对象是其余内置类型 Object 的成员;而函数是可调用对象。
null
不是一个对象。这就是为什么你无法为它分配属性的原因。typeof
返回的值是人为设定的。typeof
返回这样一个值是否有固有优势? typeof(undefined)
确实返回 undefined
,那么为什么 typeof(null)
不会类似地返回 null
呢? - Bucketnull是一种原始数据类型。它只有一个值:null。它没有构造函数。它是语言内置的对象。换句话说,您无法创建null类型的对象。