在开发当中,什么时候用null什么时候用undefined你清楚吗?

前言

在之前我对于nullundefined了解就是,用typeof操作符,null会返回 'object'undefined会返回 'undefined'、两者都是 JS 中的基本数据类型、两者被转化为布尔值时,都是 false、使用 == 进行比较时为 true、使用 === 进行比较时为 false,并没有进行一个系统的总结,现在特意写一篇文章,希望大家看完这篇文章可以对二者有更深层次的理解。

接下来,让我们弄清楚二者之间的区别。

定义

1. null

null 是一种基本数据类型,用于表示空值或者不存在的对象,即"no object"。我们可以将其视为一种特殊的占位符,表示一个变量或者对象不持有任何值,所以它通常用于初始化一个变量,以表明这个变量目前不指向任何特定的对象。

换句话说,当我们说一个变量是 null,我们是在明确地指出它目前没有被赋予任何对象的引用,它是一个尚未与任何对象建立联系的初始状态。

2. undefined

undefined 也是一种特殊的基本数据类型,用来表示一个变量已经创建,但是尚未被赋予具体的值,即"no value"。表示一个变量最原始的状态,相当于一个标记,用来指出变量存在但尚未定义其内容。这就与undefined不同了,undefined 表示变量尚未被赋值,而null 表示变量已经被赋值为空。

什么时候出现null什么时候出现undefined 🔥🔥🔥

我们先来几个场景看看:

de48741e66428a6c85562d8308bd261.png

这里我们只是定义了一个变量a,没有给它赋值,根据undefined表示no value,我们自然而然就能明白它就是undefined,它表达了这个a,将来可能是任意的值,但它现在的状态就是没有值的。

8a7660a3bfe049f20a4c8e9471675db.png

再看这个场景,我们直接使用了一个对象中不存在的属性,它得到的结果也是 undefined,它表达这个属性目前是没有值的,将来 js 可以动态为对象添加属性,所以这属性也可能是任意的值。

接下来,来看看 null

664ed8d39f691dd8e727f7cd98645a5.png

null 表达的是 no object,无对象,所以null的设计天生就和对象相关联。在这场景中document.getElementById()应该得到一个dom对象,当不存在这个对象的时候,表达的就是无对象,所以是 null

null 天生就和对象相关联,这点在我们使用 typeof 操作符也能体现。

7b37d38c48639b73665461cb9546189.png

这个“误判”也是 JavaScript 作者承认的一个缺陷。在 JavaScript 的早期实现中,值以 32位 存储,前 3位 表示数据类型的标记,其余位则表示值。在对象的内部表示中,类型标记通常是以一系列零开始的。而 null 被用来表示空值,类似于 C 语言中的空指针,它的内部表示为全零(即 32 位都是 0),所以也正是 null 的类型标记与对象的类型标记相同,typeof 操作符将 null 错误地识别为一个对象。

总的来说,nullundefined 都表示空,主要区别在于 undefined 表示尚未初始化的变量的值,而 null 表示该变量有意缺少对象指向。清楚了这个我们就能知道在开发中什么时候使用 null,什么时候使用 undefined

总结 🌸🌸🌸

null

  1. 初始化空引用:当你创建一个变量,并且你清楚地知道当前不应该指向任何对象或值时,你可以将这个变量设置为 null。比如,你声明了一个用于稍后存放数据库连接的对象,但在建立连接之前,你可以先将它设置为 null
  2. 清空对象引用:如果你有一个对象引用,但你希望删除这个引用,可以将它设置为 null
  3. 函数返回值:在函数中,如果你需要表示“没有返回任何有意义的值”,可以使用 null 作为返回值。
  4. 占位符:在某些情况下,null 可以作为占位符,直到你有了实际的值可以放入。

undefined

  1. 未初始化的变量:当你声明一个变量但还没有给它赋值时,这个变量的值默认是 undefined
  2. 函数没有返回值:如果你的函数没有使用 return 语句返回任何值,或者 return 语句没有指定任何值,函数的返回值就是 undefined
  3. 属性不存在:当你尝试访问一个对象的属性,而这个属性在对象中不存在时,你得到的是 undefined
  4. 参数未提供:如果一个函数的参数没有被调用时提供,那么这个参数的值是 undefined

看到这里,恭喜你对于nullundefined有了更深层次的了解,最后祝你也祝我在今后日子里能够登高望远,心向彼岸。


这是一个从 https://juejin.cn/post/7368662916151099431 下的原始话题分离的讨论话题