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

前言

在之前我对于null和undefined了解就是,用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 🔥🔥🔥

我们先来几个场景看看:

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

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

接下来,来看看 null。

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

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

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

总的来说,null 和 undefined 都表示空,主要区别在于 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。

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

相关推荐
怕浪猫4 小时前
GEO 优化到底是什么?AI时代内容创作者必须懂的新技能
算法·面试·github
沙漠之主8 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
hasty8 小时前
不上传新包,也能改变用户拿到的版本:npm dist-tag 的 OIDC 权限治理
前端·npm·node.js
Csvn8 小时前
diff 算法(虚拟 DOM Reconciliation)
前端
前端snow9 小时前
ai agent --- 文件存储
前端
Frag0ut9 小时前
Chrome四大版本获取及共存指南:Stable/Beta/Dev/Canary
前端·chrome·浏览器·dev·beta·canary·共存版
IT大白鼠10 小时前
搜索系列 · 第 08 篇——面试收官:高频题与全景总结
elasticsearch·面试·nosql
IT_陈寒11 小时前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
广州华水科技11 小时前
单北斗GNSS变形监测在大坝安全监测中的应用与优势
前端
zeng不错11 小时前
B站 173 个投稿活动看到眼瞎?我写了个扩展,主打一个精准打击
前端