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

其他回答

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

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

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

(name is undefined)

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

name = null;

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

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

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

name = false;

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

name = '';

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


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

Null不是一个对象,它是一个基本值。例如,不能向其添加属性。有时人们错误地认为它是一个对象,因为typeof null返回“object”。但这实际上是一个错误(甚至可能在ECMAScript 6中被修复)。

null和undefined的区别如下:

undefined: used by JavaScript and means “no value”. Uninitialized variables, missing parameters and unknown variables have that value. > var noValueYet; > console.log(noValueYet); undefined > function foo(x) { console.log(x) } > foo() undefined > var obj = {}; > console.log(obj.unknownProperty) undefined Accessing unknown variables, however, produces an exception: > unknownVariable ReferenceError: unknownVariable is not defined null: used by programmers to indicate “no value”, e.g. as a parameter to a function.

检查变量:

console.log(typeof unknownVariable === "undefined"); // true

var foo;
console.log(typeof foo === "undefined"); // true
console.log(foo === undefined); // true

var bar = null;
console.log(bar === null); // true

作为一般规则,在JavaScript中应该总是使用===,而永远不要使用==(==执行各种可能产生意外结果的转换)。检查x == null是一个边缘情况,因为它适用于null和undefined:

> null == null
true
> undefined == null
true

检查变量是否有值的一种常见方法是将其转换为布尔值,然后看它是否为真。该转换由if语句和布尔运算符!(“不”)。

function foo(param) {
    if (param) {
        // ...
    }
}
function foo(param) {
    if (! param) param = "abc";
}
function foo(param) {
    // || returns first operand that can't be converted to false
    param = param || "abc";
}

这种方法的缺点:以下所有值的计算结果都是false,所以你必须小心(例如,上面的检查不能区分undefined和0)。

定义,零 布尔值:假 数字:+0,-0,NaN 弦:“”

你可以通过使用boolean作为函数来测试到boolean的转换(通常它是一个构造函数,用于new):

> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true

问题的第一部分

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

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

例如窗口。someWeirdProperty是未定义的

”窗口。someWeirdProperty === null"的值为false时

”窗口。someWeirdProperty === undefined"的值为true。

此外,checkif if (!o)与检查if (o == null)是否为假并不相同。