什么时候在JavaScript中使用null或undefined?

When is null or undefined used in JavaScript?

本问题已经有最佳答案,请猛点这里访问。

对于javascript何时返回nullundefined,我真的很困惑。同样,不同的浏览器似乎返回这些不同。

请举例说明一下返回它们的浏览器中的null/undefined

虽然我现在对undefined方面很清楚,但我对null方面仍然不完全清楚。它类似于空白值吗?

例如,您有一个没有设置任何值的文本框。现在,当您试图访问它的值时,它是null还是undefined,它们是否相似?


我发现其中一些答案是模糊和复杂的,我找到了确定这些问题的最佳方法,就是打开控制台,自己测试一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var x;

x == null            // true
x == undefined       // true
x === null           // false
x === undefined      // true

var y = null;

y == null            // true
y == undefined       // true
y === null           // true
y === undefined      // false

typeof x             // 'undefined'
typeof y             // 'object'

var z = {abc: null};

z.abc == null        // true
z.abc == undefined   // true
z.abc === null       // true
z.abc === undefined  // false

z.xyz == null        // true
z.xyz == undefined   // true
z.xyz === null       // false
z.xyz === undefined  // true

null = 1;            // throws error: invalid left hand assignment
undefined = 1;       // works fine: this can cause some problems

所以这绝对是JavaScript中更微妙的细微差别之一。如您所见,您可以覆盖EDOCX1的值(0),使其与EDOCX1的值(2)相比有些不可靠。使用==操作符,就我所知,您可以可靠地使用nullundefined可互换。然而,由于null不能重新定义的优点,我可能会在使用==时使用它。

例如,如果variable等于nullundefinedvariable != null将始终返回false,而如果variable等于nullundefinedvariable != undefined将返回false,除非undefined事先被重新分配。

如果需要确保某个值实际上是undefined(而不是null),则可以可靠地使用===运算符来区分undefinednull

根据ECMAScript 5规范:

  • nullundefined都是六种内置类型中的两种。

4.3.9未定义值

primitive value used when a variable has not been assigned a value

4.3.11空值

primitive value that represents the intentional absence of any object value


当调用不返回节点对象时,dom方法getElementById()nextSibling()childNodes[n]parentNode()等返回null(已定义但没有值)。

属性已定义,但它引用的对象不存在。

这是为数不多的几次你可能不想测试平等-

对于空值,if(x!==undefined)将为真。

但对于不是undefinednull的值,if(x!= undefined)将是真实的(仅)。


对于各种情况,您将得到未定义的:

您用var声明一个变量,但从不设置它。

4

试图访问从未设置过的对象的属性。

1
2
var foo = {};
alert(foo.bar); //undefined

您试图访问从未提供的参数。

1
2
3
function myFunction (foo) {
  alert(foo); //undefined.
}

正如CWolves在对另一个答案的评论中指出的,函数不返回值。

1
2
3
function myFunction () {
}
alert(myFunction());//undefined

通常必须在变量或属性上有意设置空值(请参阅注释,了解可以在没有设置的情况下显示的情况)。此外,空的类型为object,未定义的类型为undefined

我还应该注意,空值在JSON中是有效的,但未定义的不是:

1
2
JSON.parse(undefined); //syntax error
JSON.parse(null); //null


I may be missing something,but afaik,you get undefinedonly.>del>

更新:好吧,我错过了很多,想完成:

你得到的是undefined

…尝试访问不存在的对象的属性时:

1
2
var a = {}
a.foo // undefined

…当您声明了一个变量但没有初始化它时:

1
2
var a;
// a is undefined

…访问未传递值的参数时:

1
2
3
4
5
function foo (a, b) {
    // something
}

foo(42); // b inside foo is undefined

…当函数不返回值时:

1
2
function foo() {};
var a = foo(); // a is undefined

可能是某些内置函数在某些错误时返回null,但如果是这样,则记录在案。null在javascript中是一个具体值,而undefined不是。

通常你不需要区分它们。根据变量的可能值,可以使用if(variable)来测试是否设置了值(nullundefined都对false进行了评估)。

Also different browsers seem to be returning these differently.

请举一个具体的例子。


关于这个主题,规范(ECMA-262)非常清楚。

我发现它非常有用和简单,所以我分享它:-在这里你会发现等式算法-在这里你会发现严格的等式算法

我在Mozilla开发人员网站的sameness部分读到了"抽象的平等、严格的平等和相同的价值"。

希望你觉得它有用。


没有定义的属性是未定义的。空是一个对象。它的类型为空。未定义不是对象,其类型未定义。

这是一篇很好的文章,解释了不同之处,并给出了一些例子。

空vs未定义