为什么null在JavaScript中被认为是一个对象?

正在检查

if ( object == null )
      Do something

if ( !object )
      Do something

?

还有:

null和undefined之间的区别是什么?


当前回答

Undefined意味着一个变量已经声明,但它没有被赋值,而Null可以赋给一个变量,表示“没有值”。(Null是赋值运算符)

2.Undefined是一个类型本身,而Null是一个对象。

3.Javascript本身可以将任何未赋值的变量初始化为undefined,但它永远不能将变量的值设置为null。这必须通过编程来完成。

其他回答

null和undefined之间的区别是什么??

没有定义的属性是未定义的。null是一个对象。它的类型是object。Null是一个特殊值,表示“没有值”。Undefined不是一个对象,它的类型是Undefined。

你可以声明一个变量,将其设置为null,除了你会看到“null”和“undefined”打印出来之外,行为是相同的。你甚至可以将一个未定义的变量与null进行比较,反之亦然,条件将为真:

 undefined == null
 null == undefined

更多细节请参考JavaScript null和undefined之间的差异。

还有你的新编辑,是的

if (object == null)  does mean the same  if(!object)

当测试object是否为false时,它们都只满足测试是否为false时的条件,而不满足测试是否为true时的条件

检查这里:Javascript抓住你了

什么是类型?

类型是对值进行分类的一种方式。下面是一个包含有问题的类型及其typeof结果的表格。

Type Values type contains typeof result Is typeof result a lie?
Undefined Only: undefined "undefined" No
Null Only: null "object" Yes
Object Infinite amount of values: {}, {a: "b"}, ... "object" No

null不是一个对象,它是一个null类型的值。

typeof操作符在说谎!它返回“object”为空在JavaScript语言中是一个错误。

我在我的开源电子书中写了一章。你可以在这里阅读https://github.com/carltheperson/advanced-js-objects

(name is undefined)

你:你叫什么名字?(*) JavaScript:名字?名字是什么?我不知道你在说什么。你从来没提过任何名字。你在(客户端)看到其他脚本语言了吗?

name = null;

你:你叫什么名字? JavaScript:我不知道。

简而言之,未定义是指事物没有概念存在;它没有类型,在此范围内从未被引用过;Null是已知对象存在的位置,但不知道值是多少。

需要记住的一件事是,null在概念上与false或""或诸如此类的不一样,即使它们在类型转换后相等,即。

name = false;

你:你叫什么名字? 布尔值为false。

name = '';

你:你叫什么名字? JavaScript:空字符串


*: name在此上下文中的意思是一个从未定义过的变量。它可以是任何未定义的变量,然而,name是几乎任何HTML表单元素的属性。它可以追溯到很久以前,在id之前就设立了。它很有用,因为id必须是唯一的,但名称不必是唯一的。

TLDR

undefined是JavaScript中的一个基本值,表示一个值的隐式缺失。未初始化的变量自动具有此值,而没有显式返回语句的函数则返回undefined。

null也是JavaScript中的一个基本值。它表示有意不存在对象值。JavaScript中的null被设计用来实现与Java的互操作性。

typeof null返回“object”,这是由于语言设计的特殊性,源于JavaScript与Java可互操作的需求。它并不意味着null是一个对象的实例。这意味着:给定JavaScript中的原语类型树,null是“对象类型原语”子树的一部分。下面将更详细地解释这一点。

细节

Undefined是一个基本值,表示一个值的隐式缺失。注意,直到1998年的JavaScript 1.3版本才可以直接访问undefined。这告诉我们,null是程序员在显式表示缺少某个值时使用的值。未初始化的变量的值自动为undefined。undefined是ECMAScript规范中独一无二的类型。

Null是一个基本值,表示对象值的故意缺失。null也是ECMAScript规范中独一无二的类型。

JavaScript中的null是为了实现与Java的互操作性而设计的,无论是从“外观”的角度还是从编程的角度(例如计划于1996年实现的LiveConnect Java/JS桥)。Brendan Eich和其他人都表达了对包含两个“缺少值”值的厌恶,但在1995年,Eich奉命“让[JavaScript]看起来像Java”。

布兰达:服从指令

如果我没有从管理层那里得到“让它看起来像Java”的命令, 而且我有更多的时间(很难理清这两个因果因素),那么我就会更喜欢一个自我式的“一切都是一个对象”。 方法:没有布尔,数字,字符串包装。没有undefined和null。 叹息。

为了适应Java的null概念,由于Java的强类型性质,它只能被分配给类型为引用类型的变量(而不是原语),Eich选择将特殊的null值定位在对象原型链的顶部(即引用类型的顶部),并将null类型作为“对象类型原语”集的一部分。

typeof运算符随后在1996年8月19日发布的JavaScript 1.1中加入。

来自V8博客:

Typeof null返回对象,而不是null,尽管null是一个 自己的类型。要理解为什么,考虑所有的集合 JavaScript类型分为两组: 对象(即对象类型) 原语(即任何非对象值) 因此,null意味着“没有对象值”,而undefined意味着“没有” 价值”。

按照这个思路,Brendan Eich设计了JavaScript 使typeof为右边的所有值返回'object', 即所有对象和空值,在Java的精神。这就是为什么 Typeof null === 'object',尽管规范有一个单独的null类型。

因此,Eich设计了基元类型的层次结构,以实现与Java的互操作性。这导致他将null与层次结构中的“对象类型原语”一起定位。为了反映这一点,当typeof不久后被添加到语言中时,他选择typeof null来返回“object”。

JavaScript开发人员对typeof null === "object"表示惊讶,这是弱类型语言(JavaScript)和另一种强类型语言(Java)之间的阻抗不匹配(或抽象泄漏)的结果,弱类型语言(JavaScript)同时具有null和未定义,而另一种强类型语言(Java)只有null,其中null被严格定义为引用类型(而不是基本类型)。

请注意,这一切都是合乎逻辑的、合理的、站得住脚的。typeof null === "object"不是bug,而是必须适应Java互操作性的二阶效应。

出现了许多不完善的反向合理化和/或惯例,包括undefined表示隐式缺少值,null表示有意缺少值;或者,undefined是一个值的缺失,null是一个具体的对象值的缺失。

与Brendan Eich的相关对话,为后人截屏:

问题的第一部分

为什么null在JavaScript中被认为是一个对象?

这是他们现在无法修复的JavaScript设计错误。它应该是null类型,而不是object类型,或者根本没有它。在检测真实对象时,需要进行额外的检查(有时会忘记),这是bug的来源。

问题的第二部分:

正在检查 If (object == null) 做某事 和 如果对象(!) 做某事

这两个检查总是都是假的,除了:

对象未定义或为空:均为true。 对象是原语,0,"",或false:第一次检查为假,第二次检查为真。

如果对象不是一个原语,而是一个真实的对象,比如new Number(0)、new String("")或new Boolean(false),那么两个检查都为假。

因此,如果'object'被解释为一个真实的对象,那么两个检查总是相同的。如果允许使用原语,则对0、""和false进行不同的检查。

在object==null这样的情况下,不明显的结果可能是bug的来源。不建议使用==,请使用===代替。

问题的第三部分:

还有: null和undefined之间的区别是什么?

在JavaScript中,一个区别是null的类型是object,而undefined的类型是undefined。

在JavaScript中,null==undefined为真,如果忽略type则认为相等。为什么他们决定,但是0 ""和false不相等,我不知道。这似乎是一个武断的观点。

在JavaScript中,null===undefined不为真,因为在===中的类型必须相同。

实际上,null和undefined是相同的,因为它们都表示不存在。0和“”也是如此,也许还有空容器[]和{}。如此多相同的“无”是滋生bug的秘诀。一种或完全没有是更好的。我会尽量少用。

'false', 'true'和'!'是另一个可以简化的问题,例如,如果(!x)和如果(x)单独是充分的,你不需要真和假。

如果没有给出值,则声明的var x是未定义的类型,但它应该与从未声明x相同。另一个错误源是空容器。所以最好同时声明和定义它,比如var x=1。

人们绕着圈子转来转去,试图弄清楚所有这些不同类型的虚无,但它们都是同样的东西,只是穿着复杂的不同衣服。现实是

undefined===undeclared===null===0===""===[]==={}===nothing

也许所有都应该抛出异常。