JavaScript中的null是一个对象吗?

14

可能重复:
JavaScript中的Null对象

你好,我已经阅读了关于JavaScript中null的此线程,但我现在对null的身份非常困惑。

众所周知,nulltypeof(null)评估为object,因为语言设计错误,而ECMA声明null是Null类型

   8.2 The Null Type
   The Null type has exactly one value, called null.

为什么人们一直说null是一个对象?

有人说null是一个单例对象。在JavaScript中,每个人都这样看待null吗?


1
@karim79 是的,我已经阅读了那个帖子,并在一些答案的评论中提出了我的问题,但没有得到回应,所以我在这里提出了它。谢谢。 - c4il
1
你已经用引语回答了自己。null(一个代表它本身的值——读作:“不是任何其他东西”——并且 null === null,对于所有的 null)是 Null 类型中唯一的成员。正如你所指出的,实际的“对象性”是有争议的,但 null 的特性使其成为一个大多数无声的点。 - user166390
你的"语言设计错误"链接引用了道格拉斯·克罗克福德的一篇文章——我(个人而言)不建议你全盘接受他所说的话。 - Reinsbrain
3个回答

11

Null表示对象的缺失,Undefined则表示尚未被赋值,而null表示已被赋值为空。

Null不真正是一个单例对象,因为对它进行解引用会导致错误;例如for (var x in null)将导致错误。回想一下指针的时代,当指针没有指向任何对象时,它的值就是null。


1
在许多浏览器上,for (var x in null);不会抛出异常,尽管按照ECMAScript第3版的规定应该会抛出异常(当值为nullundefined时,ToObject操作将会抛出异常)。但是这种情况已经改变了,现在根据ECMAScript 5的规定,如果表达式为nullundefined,该语句将正常结束(一个普通的语句完成)。 - Christian C. Salvadó
1
不错,HTML格式的ECMA规范。我已经寻找它很久了! :) - c4il

7
不,null是几种基本类型之一(其他包括数字、字符串、布尔和未定义)。其他所有东西都是对象,包括函数、数组和正则表达式。数字、字符串和布尔通常被称为“类似对象”,因为它们有方法,但是它们是不可变的。另一方面,对象是可变的。

可变性与是否为对象无关。参见 EcmaScript 5 中的 Object.freeze,它允许创建不可变对象。EcmaScript 3 中的本地对象也是对象,并且可以是不可变的。null 不是对象,因为它无法响应任何消息——没有属性或方法。这就是为什么 (null instanceof type) 对于所有类型都为 false 的原因。 - Mike Samuel
1
@mikesamuel:我从我的回答中删除了“有问题的”部分 :) - Daniel Vassallo
“Object-like”可能不是描述原始类型在尝试用作对象时临时装箱的正确术语。 - alex

2

null 不能被视为对象,因为它没有属性。它是一个代表原始值的关键字,就像 truefalse 一样。

> true instanceof Object
false
> null instanceof Object
false

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