开发者问题收集

JavaScript 中 null 和 undefined 有什么区别?

2011-02-22
694611

JavaScript 中 nullundefined 有什么区别?

3个回答

undefined 表示变量已声明但尚未赋值:

var testVar;
console.log(testVar); //shows undefined
console.log(typeof testVar); //shows undefined

null 是一个赋值。它可以作为无值的表示赋给变量:

var testVar = null;
console.log(testVar); //shows null
console.log(typeof testVar); //shows object

从前面的例子中,很明显 undefinednull 是两种不同的类型: undefined 本身是一种类型(未定义),而 null 是一个对象。

证明:

console.log(null === undefined) // false (not the same type)
console.log(null == undefined) // true (but the "same value")
console.log(null === null) // true (both type and value are the same)

null = 'value' // Uncaught SyntaxError: invalid assignment left-hand side
undefined = 'value' // 'value'
sebastian
2011-02-22

可以用卫生纸架来解释这种差异:

  • 非零值就像一个带有一卷卫生纸的支架,并且纸巾仍然在管子上。

  • 零值就像一个带有空卫生纸管的支架。

  • 空值就像一个甚至没有纸巾管的支架。

  • 未定义的值类似于支架本身丢失。

Sebastian Norr
2019-07-29

我从 这里 摘录了这段代码

The undefined value is a primitive value used when a variable has not been assigned a value.

The null value is a primitive value that represents the null, empty, or non-existent reference.

当您通过 var 声明一个变量并且不给它赋值时,它的值将为 undefined。如果您尝试对这个值进行 WScript.Echo() 或 alert(),您将看不到任何内容。但是,如果您向它附加一个空白字符串,那么它会突然出现:

var s;
WScript.Echo(s);
WScript.Echo("" + s);

您可以声明一个变量,将其设置为 null,其行为是相同的,只是您会看到打印出来的是“null”,而不是“undefined”。这确实是一个很小的差异。

您甚至可以将未定义的变量与 null 进行比较,反之亦然,条件将为真:

undefined == null
null == undefined

但是,它们被视为两种不同的类型。虽然 undefined 本身就是一种类型,但 null 被视为特殊的对象值。您可以使用 typeof() 来查看这一点,它返回一个表示变量一般类型的字符串:

var a;
WScript.Echo(typeof(a));
var b = null;
WScript.Echo(typeof(b));

运行上述脚本将产生以下输出:

undefined
object

无论它们是不同的类型,如果您尝试访问其中任何一个的成员,它们的行为仍然相同,即它们将引发异常。使用 WSH 时,您将看到可怕的“'varname' 为空或不是对象”,如果您很幸运的话(但这是另一篇文章的主题)。

您可以明确地将变量设置为未定义,但我强烈建议不要这样做。我建议只将变量设置为空,并将您忘记设置的值保留为未定义。同时,我真的鼓励您始终设置每个变量。JavaScript 的作用域链与 C 风格语言不同,即使是经验丰富的程序员也很容易感到困惑,将变量设置为空是防止基于此的错误的最佳方法。

另一个您将看到未定义弹出的情况是使用 delete 运算符时。来自 C 世界的人可能会错误地将其解释为破坏对象,但事实并非如此。此操作的作用是从数组中删除下标或从对象中删除成员。对于数组,它不会影响长度,而是下标现在被视为未定义。

var a = [ 'a', 'b', 'c' ];
delete a[1];
for (var i = 0; i < a.length; i++)
WScript.Echo((i+".) "+a[i]);

上述脚本的结果是:

0.) a
1.) undefined
2.) c

读取从未存在过的下标或成员时,您也会返回未定义。

null 和 undefined 之间的区别是:JavaScript 永远不会将任何内容设置为 null,而我们通常这样做。虽然我们可以将变量设置为 undefined,但我们更喜欢 null,因为这不是为我们做过的事情。当您进行调试时,这意味着任何设置为 null 的内容都是您自己的操作,而不是 JavaScript。除此之外,这两个特殊值几乎是等效的。

ayush
2011-02-22