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

正在检查

if ( object == null )
      Do something

if ( !object )
      Do something

?

还有:

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


当前回答

理解null和undefined的一种方法是了解它们出现的位置。

在以下情况下期望返回空值:

查询DOM的方法 console.log (window.document.getElementById(“nonExistentElement”)); / /输出:零 从Ajax请求接收到的JSON响应


    {
      name: "Bob",
      address: null
    }

RegEx.exec。 新功能处于不断变化的状态。下面返回null:


        var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));

       // But this returns undefined:

        Object.getOwnPropertyDescriptor({}, "a");

所有其他不存在的情况都用undefined表示(由@Axel指出)。以下每一个都打印为“undefined”:

    var uninitalised;
    console.log(uninitalised);

    var obj = {};
    console.log(obj.nonExistent);

    function missingParam(missing){
        console.log(missing);
    }

    missingParam();

    var arr = [];
    console.log(arr.pop());        

当然,如果你决定写var unitialized = null;或者你自己从一个方法中返回null,那么你在其他情况下也会出现null。但这应该是很明显的。

第三种情况是当你想访问一个变量,但你甚至不知道它是否已经声明。在这种情况下,使用typeof来避免引用错误:

if(typeof unknown !== "undefined"){
    //use unknown
}

总之,在操作DOM、处理Ajax或使用某些ECMAScript 5特性时检查是否为空。对于所有其他情况,检查undefined严格相等是安全的:

if(value === undefined){
  // stuff
}

其他回答

问题的第一部分

为什么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

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

Null是一个对象。它的类型是null。Undefined不是一个对象;其类型是未定义的。

为了补充“undefined和null之间的区别是什么”的答案,请参阅JavaScript权威指南第6版,本页第41页:

你可能认为undefined表示系统级的,意外的, 或者类似错误的无值和null表示程序级, 正常的,或预期的价值缺失。如果你需要分配一个 将这些值传递给变量或属性或将其中一个值传递给 一个函数,null几乎总是正确的选择。

(name is undefined)

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

name = null;

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

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

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

name = false;

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

name = '';

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


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

未定义和未定义不是一回事。

age;

年龄的价值是什么?

电脑:好的,让我查一下我的内存/参考表.....在这一点上(你问的时间),我没有看到任何标识符名为年龄,不在这个范围/上下文或任何父范围/上下文;我不知道年龄。也许稍后我会遇到一个指令,将该标识符添加到内存中,但它现在不存在。

var age;

你:年龄的价值是什么;

电脑:好的,检查一下我的记忆……我在引用表中看到一个标识符,它的名字是age,但在我添加它的时候,没有值或指针或任何东西被分配给它,所以我不知道;你可以认为它(年龄)空了/什么都没有/没用。

var age = null;

你:年龄的价值是什么;

电脑:好的,检查一下我的记忆……我看到年龄在我的参考表:它是空的。基本上,它是nothing/empty,你不能用这个值做任何事情;这是故意的。

现在,我可能不应该这样解释,但希望这是有意义的。

我明白为什么null被设计成JS中的一个对象,我个人也喜欢这样。

Null和undefined实际上意味着同样的事情:空/无。区别在于它在概念上是如何使用的。

我认为null是开发者想要的虚无;一些东西被设为null是为了不代表任何东西。我将未定义视为计算机意图的虚无;开发者/用户无意中发现了一些没有价值的东西。

例如,如果你从库/sdk调用一个函数并返回null,你几乎可以确定这是由开发人员/作者故意设计的;他们特别想表明虚无。

另见- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/null