JavaScript里null与undefined的区别与相似点

初次看,null和undefined看似是一样的,但远非如此。 本文将探讨JavaScript中null和undefined的区别和相似之处。

null是什么?

有两个你应该理解的null特性:

  • null是空的或不存在的值。
  • null必须显式赋值。

将null的值赋给a示例:

let a = null;
console.log(a);
// 输出null

undefined是什么?

Undefined最典型的是指一个变量已被声明,但未被定义。

let b;
console.log(b);
// 输出undefined

你也可以显式设置一个变量为undefined:

let c = undefined;
console.log(c);
// undefined

最后,在Object对象中查找不存在的属性时,也会得到undefined:

var d = {};
console.log(d.fake);
// undefined

null和undefined的相似点

在JavaScript中只有六个表示false的值。 null和undefined是其中的两个。 这是表示false值得完整列表:

  • false
  • "" (空字符串)
  • null
  • undefined
  • NaN

JavaScript中的任何其他值都被认为是true。

同样在JavaScript中,有六个基本值。 null和undefined都是基本值。 这是一个完整的列表:

  • Boolean
  • Null
  • Undefined
  • Number
  • String
  • Symbol

JavaScript中的所有其他值都是Object(对象,函数,数组等)。

有趣的是,当使用typeof来检测null时,它返回object:

let a = null;
let b;
console.log(typeof a);
// object
console.log(typeof b);
// undefined

这从JavaScript开始就已经发生,通常认为这是原始JavaScript实现的一个错误。

null !== undefined

正如你目前所看到的,null和undefined是不同的,但是有一些相似之处。 因此,null并不严格等于undefined。

null !== undefined 

但是,这可能会让你感到惊讶,null松散地等于undefined。

null == undefined

在JavaScript中,使用松散相等(==)比较会做类型转换。 它会隐含将值转换为常用类型后再做比较。

实际区别

所有这些都很好,但是null和undefined之间的实际区别呢?

想想下面的代码片段:

let logHi = (str = 'hi') => {
  console.log(str);
}

上面的代码创建了logHi函数。 这个函数需要一个参数,如果没有提供,那么将这个参数默认设置为hi。如下:

logHi();
// hi

我们也可以提供一个参数来覆盖这个默认值:

logHi('bye');
// bye

如果传undefined,默认参数会用默认值,而null则不会。

logHi(undefined);
// hi
logHi(null);
// null

总结

  • null是被赋值的值。 表示什么都没有。
  • undefined最典型的是指一个变量已被声明,但未被定义。
  • null和undefined都是false值。
  • null和undefined都是基本类型的值。 但是,有一个错误就是执行typeof null为object。
  • null !== undefined 但是 null == undefined。

原文参考:https://codeburst.io/javascript-null-vs-undefined-20f955215a2

版权声明:著作权归作者所有。

相关推荐

MySQL:datetime与timestamp的区别及使用选择

datetime与timestamp的区别1、存储空间不同在MySQL,timestamp在内部存储为整型,占用4个字节,而datetime占用8个字节。2、存储方式不同timestamp存储时,会从插入时间的客户端时区转换为UTC(世界标准时间)时间存储,而datetime不会做时间的转换直接存储。3、存储的时间范围不同timestamp:UTC时间,1970-01-01 00:00:

Kotlin:return与跳转

Kotlin有两种跳转:循环跳转(break与continue)和返回跳转(return)。Labellabel语法:labelName@ label可以放在任何表达式之前,用来标记表达式。如loop@ for (i in 1..100) {     // ... } break和continueb

JavaScript undefined与ReferenceError: xxx is not defined

在JavaScript里,为了简便,判断语句常常这样写:if(abc) {   //do something } 变量未声明假如abc变量没有被声明,但此处会报错:ReferenceError: abc is not defined 变量已声明,为初始化示例修改下变为var abc; if(abc)&nbs