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


当前回答

在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”分配了一个空值

其他回答

理解差异的最佳方法是首先理清JavaScript的内部工作原理,并理解以下两者之间的含义差异:

let supervisor = "None"
    // I have a supervisor named "None"

let supervisor = null
    // I do NOT have a supervisor. It is a FACT that I do not.

let supervisor = undefined
    // I may or may not have a supervisor. I either don't know
    // if I do or not, or I am choosing not to tell you. It is
    // irrelevant or none of your business.

这三种情况的含义不同,JavaScript用两个不同的值(null和undefined)来区分后两种情况。您可以自由地明确使用这些值来表达这些含义。

那么,由于这种哲学基础而产生的一些JavaScript特定问题是什么呢?

没有初始值设定项的已声明变量将获得未定义的值,因为您从未说过预期值是什么。出租监督员;断言(主管==未定义);从未设置过的对象的属性求值为undefined,因为没有人说过该属性。const dog={name:“Sparky”,年龄:2};断言(dog.bred==未定义);null和undefined彼此“相似”,因为Brendan Eich是这么说的。但它们显然彼此不相等。断言(null==未定义);断言(null!==未定义);谢天谢地,null和undefined有不同的类型。null属于null类型,undefined属于undefined类型。这在规范中,但你永远不会知道这一点,因为我不会在这里重复这种奇怪的类型。如果函数到达其主体的末尾而没有显式返回语句,则返回undefined,因为您不知道它返回了什么。

顺便说一句,JavaScript中还有其他形式的“虚无”(学习哲学很好……)

NaN公司使用从未声明的变量并接收ReferenceError在其时间死区中使用let或const定义的局部变量并接收ReferenceError稀疏数组中的空单元格。是的,虽然它们与undefined相比==,但它们甚至没有定义。$节点>常量a=[1,未定义,2]>常量b=[1,2]>一个[1,未定义,2]>b级[1,<1空项>,2]

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

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

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

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

null是一个特殊的关键字,表示缺少值。

将其视为一种价值,例如:

“foo”是字符串,true为布尔值,1234是数字,null未定义。


undefined属性表示尚未为变量分配包含null的值。喜欢

var foo;

定义的空变量为null,数据类型为undefined


它们都表示一个没有值的变量的值

以及null不表示没有值的字符串-空字符串-


Like

var a = ''; 
console.log(typeof a); // string 
console.log(a == null); //false 
console.log(a == undefined); // false 

现在如果

var a;
console.log(a == null); //true
console.log(a == undefined); //true 

BUT

var a; 
console.log(a === null); //false 
console.log(a === undefined); // true

所以每个人都有自己的使用方法

undefined使用它来比较变量数据类型

null使用它来清空变量的值

var a = 'javascript';
a = null ; // will change the type of variable "a" from string to object 

通常,不要使用null以避免混淆。

标准库方法返回undefined,而不是null

let a = [10];
console.log(a[1]) //=> undefined
console.log(a.find(value => value === 5)) //=> undefined

我经常在人们的代码中看到,某个变量最初未定义,然后赋值给某个值,然后通过设置为null来清除。这是不一致的,最好回到undefined。

尽管如此,如果框架使用null,或者对于json序列化,null是有意义的。

您可能认为undefined表示系统级、意外或错误,如缺少值,null表示程序级、正常或预期缺少值。

通过JavaScript:最终指南