JavaScript 中 null 和 undefined 有什么区别?
JavaScript 中
null
和
undefined
有什么区别?
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
从前面的例子中,很明显
undefined
和
null
是两种不同的类型:
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'
我从 这里 摘录了这段代码
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。除此之外,这两个特殊值几乎是等效的。