在JavaScript中,null和undefined之间有什么区别?

1645
在JavaScript中,nullundefined有什么区别?

32
我一直认为:null 表示你有意将其设置为空,而 undefined 是因为没有被设置而为空。或者说 null 是故意设置为空,而 undefined 则仍然为空。基本上这展示了意图。 - Muhammad Umer
64
看看这个。console.log(null-undefined)。null和undefined的区别是NaN。(请注意,这是一次幽默尝试,不要因为误解问题而批评我。) - Ivan
了解undefined及其与作用域的关系 https://codepen.io/grumpy/post/undefined-scope-in-javascript - AL-zami
1
值得一提的是,尽管“null”的发明者Tony Hoare称其为他的“十亿美元错误”,JavaScript却愉快地将这个错误乘以了2。祝你调试愉快! - Chris Collett
显示剩余5条评论
39个回答

4

null和undefined都用于表示某个值的缺失。

var a = null;

a被初始化并定义。

typeof(a)
//object

null在JavaScript中是一个对象

Object.prototype.toString.call(a) // [object Object]

var b;

b未定义且未初始化

对象属性未定义也是未定义的。例如,在对象c上未定义“x”,如果尝试访问c.x,则会返回未定义。

通常我们将null赋值给变量,而不是undefined。


1
Object.prototype.toString.call(null); // "[object Null]" - Paul S.

4
在JavaScript中,所有变量都以键值对的形式存储。每个变量都以variable_name: variable_value/reference的形式存储。 undefined表示变量在内存中占用了空间,但没有给它赋值。作为最佳实践,不应将此类型用作赋值。
在这种情况下如何表示当您希望变量在代码的后面某个时间点处没有值时?您可以使用null类型,它也是一种用于定义相同内容即缺少值的类型,但与undefined不同,在这种情况下您实际上已经在内存中有了该值。该值是null 两者类似但用法和含义不同。

4
根据Ryan Morr在这个主题上的详细文章,通常情况下,如果需要将非值分配给变量或属性,传递到函数中,或从函数返回,则null几乎总是最佳选择。简单来说,JavaScript使用undefined,程序员应该使用null。请参见探索null和undefined的永恒深渊

4

undefined 和 null 的含义差异是 JavaScript 设计的偶然结果,在大多数情况下并不重要。在需要关注这些值的情况下,我建议将它们视为基本可以互换的。

来自 《JavaScript高级程序设计》 一书。


3

看这里,输出值得千言万语。

var b1 = document.getElementById("b1");

checkif("1, no argument"                        );
checkif("2, undefined explicitly",     undefined);
checkif("3, null explicitly",               null);
checkif("4, the 0",                            0);
checkif("5, empty string",                    '');
checkif("6, string",                    "string");
checkif("7, number",                      123456);

function checkif (a1, a2) {
 print("\ncheckif(), " + a1 + ":");
 if (a2 == undefined) {
  print("==undefined:    YES");
 } else {
  print("==undefined:    NO");
 }
 if (a2 === undefined) {
  print("===undefined:   YES");
 } else {
  print("===undefined:   NO");
 }
 if (a2 == null) {
  print("==null:         YES");
 } else {
  print("==null:         NO");
 }
 if (a2 === null) {
  print("===null:        YES");
 } else {
  print("===null:        NO");
 }
 if (a2 == '') {
  print("=='':           YES");
 } else {
  print("=='':           NO");
 }
 if (a2 === '') {
  print("==='':          YES");
 } else {
  print("==='':          NO");
 }
 if (isNaN(a2)) {
  print("isNaN():        YES");
 } else {
  print("isNaN():        NO");
 }
 if (a2) {
  print("if-?:           YES");
 } else {
  print("if-?:           NO");
 }
  print("typeof():       " + typeof(a2));
}

function print(v) {
 b1.innerHTML += v + "\n";
}
<!DOCTYPE html>
<html>
<body>
<pre id="b1"></pre>
</body>
</html>

另请参阅:

祝好!


1
从这里我实际上学到了isNaN(null)返回false - 这让我感到惊讶。 - J. Bruni

3

null - null是一种赋值值,与变量一起使用来表示没有值(它是一个对象)。

undefined - undefined是一种变量,它没有被分配任何值,所以JavaScript会给它分配一个未定义的值(它是一种数据类型)。

undeclared - 如果一个变量根本没有被创建,那么它就被称为未声明。


3

由于typeof返回undefined,undefined是一种类型,而null是一个初始化器,表示变量没有指向任何对象(实际上Javascript中的几乎所有内容都是对象)。


2
< p > undefinednull 的区别很小,但它们是不同的。值为 undefined 的变量从未被初始化过,而值为 null 的变量是明确赋值为 null 的,这意味着该变量被显式设置为没有值。如果使用 null==undefined 表达式进行比较,则它们将相等。


这个答案是误导性的...请查看被接受的答案中的讨论。底线是,null==undefined之所以为true,仅因为存在隐式转换(或JS中等效的术语)。显然,null===undefinedfalse,因为使用===时它会比较类型 - Guy

2

通常情况下,为避免混淆,请勿使用 null

  1. 标准库方法返回 undefined,而不是 null
let a = [10];
console.log(a[1]) //=> undefined
console.log(a.find(value => value === 5)) //=> undefined
  1. 我经常在人们的代码中看到某些变量起初是undefined,然后被赋值为某个值,最后通过设置为null来清空。这不够一致,更好的做法是将其设置回undefined

但是,如果框架使用null,或者用于JSON序列化,则null是有意义的。


2
引自Marijn Haverbeke所著《JavaScript编程精解》第三版的引语:
undefined”和“null”之间的含义差异是 JavaScript 设计的一个偶然结果,在大部分情况下都不太重要。在您确实需要关注这些值的情况下,我建议将它们视为大多可以互换的。
老实说,一开始我对这个建议有点怀疑,然而根据我的理解,这是一种懒惰(vs 渴望)处理它们之间差异的方法。也许我们根本不必处理它们之间的差异。如果需要处理,我们可以延迟考虑它们,直到必须要处理的时候才考虑。并且不需要在代码流中每一步过度地/防御地担心这些值(nullundefined)。
注:“这不是对您问题的直接回答,只是一个相关的观点。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接