JS-null和undefined区别

7/11/2024 js

在js中,null和undefined在语言设计上代表了两种不同的“缺失值”概念,它们在某些情况下会被视为相似。

# 语义

undefined: undefined通常表示一个变量已经被声明,但还没有被赋值,或者一个函数期望接收一个参数但实际上没有收到。

使用场景:

  • 当一个变量声明后没有初始化,它的默认值就是undefined。
  • 函数参数如果没有传递值,该参数的值默认为undefined。
  • 访问一个对象不存在的属性时返回undefined。
  • 一个表达式或语句没有返回值时,其结果也是undefined。
  • 如果一个函数没有明确的返回值,函数的返回值默认为undefined。

null: null通常表示一个明确的空值,意味着“没有任何东西”或“没有任何对象”。它常被用来表示一个对象引用的缺失。

使用场景:

  • 当你想要清除一个对象引用时,可以将其设为null。
  • 作为函数的参数,明确表示该参数不包含任何对象。
  • 在数据库查询中,null可以表示缺失或未知的数据。
  • 当初始化一个变量,但还不确定应该赋予什么值时,有时会将其初始化为null。

# 宽松相等运算符 ==

当使用==运算符比较null和undefined时,它们会被认为是相等的,这是因为==运算符在比较两个值之前会进行类型转换,这一过程被称为“类型强制”或“类型提升”。 当一个值是null,另一个值是undefined,或者反过来,JavaScript的==运算符会认为它们相等。这是因为在类型强制的规则下,null和undefined都被认为是“非对象”(non-object),并且在类型转换成数字时都变为0。

当使用宽松比较运算符 == 进行比较时,如果两边的类型不一致,JavaScript 会尝试将它们转换到同一类型再进行比较。对于对象和非对象之间的比较,转换规则如下:

  1. 如果一边是对象,另一边是原始类型,那么对象会尝试转换为其原始值。
  2. 对象到原始值的转换会首先尝试调用 valueOf() 方法,如果 valueOf() 返回的仍然是一个对象,则会调用 toString() 方法。
  3. 一旦对象被转换为原始值,比较就会在两个原始值之间进行。否则返回false

当使用 === 需要比较 类型 和 值。

# 类型不同

  • typeof null返回"object"(这是一个历史遗留问题,null实际上并不表示一个对象,但出于兼容性原因,typeof null的结果被设定为"object")。
  • typeof undefined返回"undefined"。

# 类型转换

类型 null undefined
Boolean false false
String "null" "undefined"
Number 0 NaN
Object [Object null] [Object undefined]