我想知道JavaScript中null和undefined之间的区别。


当前回答

由于typeof返回undefined,undefineed是一种类型,其中null是一个初始值设定项,表示变量指向任何对象(实际上Javascript中的所有内容都是一个对象)。

其他回答

null:缺少变量值;undefined:缺少变量本身;

..,其中变量是与值关联的符号名称。

JS可以用null隐式初始化新声明的变量,但它没有。

已经给出了很多“技术性”的答案,从JS仅仅是一种编程语言的有限角度来看,所有答案都是正确的。

然而,我想补充以下想法,特别是当您将TypeScript代码作为更大项目/(企业)应用程序的一部分时:

当与某种后端交谈时,您很可能会收到JSON虽然一些后端正确地避免了在JSON中使用“null”(删除那些财产),但其他后端没有这样做现在,虽然“null”可能意味着该值是故意缺失的,但更多情况下,它并没有传达这一含义。大多数数据库使用“null”只是因为它们没有“undefined”类型。但真正的含义只是“未定义”。因此,您永远无法知道“null”值是否真的意味着故意缺席。因此,“空”并不意味着故意选择“缺失值”。一般来说,这是无法决定的。因此,在语义上,“null”和“undefined”实际上是完全相同的。

因此,为了协调一致,我坚决反对使用“null”,并希望鼓励您停止在代码中使用“null“。这比你想象的要容易得多。别误会我。我不是说不处理“null”值,只是为了避免在代码中显式使用它们。换句话说:您的代码应该仍然能够处理来自应用程序外部的意外传递的“null”值,例如通过第三方库(如Angular)或第三方后端。

以下是实现这一目标的指导原则:

避免直接的未定义类型保护(例如,如果(值==未定义){…}。相反,使用间接类型保护(也称为真实性检查),例如if(value){…}每当0或空字符串有意义时,请使用像Lodash的isNil这样的显式助手方法或在比较中包含有意义的值(例如,如果(!value&&value!==0){…})考虑使用不允许使用null的lint规则

const data  = { banners: null }
const { banners = [] } = data;
console.log(data)      // null


const data  = { banners: undefined }
const { banners = [] } = data;
console.log(data)      // []

引自Marijn Haverbeke第三版《Elquent Javascript》:

undefined和null之间的含义差异是Javascript设计的一个意外,大多数时候这并不重要。如果你真的需要关注这些价值观,我建议你将它们视为可以互换的

老实说,一开始,我对这个建议有点怀疑。然而,在我自己的解释中,这是一种懒惰(或渴望)的方式来处理他们的分歧。也许,我们根本不需要处理这些差异。如果我们必须这样做,我们可以延迟我们的担忧(直到我们不得不这样做),而不是在这些值(null和undefined)流经我们的代码的每一步都过度/防御性地担心它。

PS:这不是对你问题的直接回答。这只是一个相关的观点。

在JavasScript中有5种基本数据类型:String、Number、Boolean、null和undefined。我将尝试用一些简单的例子来解释。

假设我们有一个简单的函数

 function test(a) {
     if(a == null) {
        alert("a is null");
     } else {
        alert("The value of a is " + a);
     }
  }

此外,在上述函数中,if(a==null)与if(!a)相同。

现在,当我们调用此函数而不传递参数

test(); // will alert "a is null";
test(4); // will alert "The value of a is " + 4;

also

var a;
alert(typeof a);

这将给出未定义的;我们声明了一个变量,但没有为该变量赋值;

但如果我们写

var a = null;
alert(typeof a); // will give alert as object

所以null是一个对象。在某种程度上,我们为“a”分配了一个空值