简单讲解 ECMAScript 2019 的 nullish 合并运算符??

ECMAScript 2019 的 nullish 合并运算符是 JavaScript 中的一个新特性,它可以在处理值为 null 或 undefined 的情况下,提供更加精准的运算结果和代码可读性。在本文中,我们将详细讲解这个新特性的用法和优势,并提供一些实际示例代码和指导建议。

  1. nullish 合并运算符的背景和目的

在 JavaScript 中,由于历史原因和语言异构性,有许多逻辑运算符(例如 || 和 &&),它们在处理特定的数据类型或值时,存在一些问题或不一致的情况。其中一个典型的例子就是对于 falsy 值(包括 0、''、false 和 null 等),常常会与合法的数值或字符串混淆或被忽略。

为了解决这些问题,ES2015 引入了严格比较运算符(=== 和 !==),以及箭头函数、let/const 关键字等新语法特性。然而,尽管这些更新已经显著提高了 JavaScript 代码的质量和可维护性,但对于某些特殊的情况和需求,它们依然不够灵活和易用。

因此,ES2019 引入了 nullish 合并运算符 ??,它可以有效处理 null 和 undefined 值,并在逻辑运算中提供更加准确和直观的结果。具体来说,nullish 合并运算符的目的有以下几个方面:

  • 在判断变量为 null 或 undefined 时,不再与 falsy 值混淆,而是明确地表示为 null 或 undefined;
  • 在逻辑运算中,可以更加精确地区分 null 和 undefined,避免出现“短路”的错误结果;
  • 在编写代码时,提供一种更加简洁和可读的语句,特别是在使用 ES6/ES7 的对象和函数默认值语法时,可以更好地处理边界情况。
  1. nullish 合并运算符的基本用法和语法

nullish 合并运算符的语法结构是 ??. 它的作用是在左右两个表达式中,选取第一个“nullish”(即 null 或 undefined)的表达式作为返回值,如果两个都不为“nullish”,则选取左边的表达式。例如:

const a = null; const b = undefined; const c = 'foo'; const d = 0;

console.log(a ?? b); // 输出: undefined console.log(a ?? c); // 输出: 'foo' console.log(d ?? c); // 输出: 0

在上述代码中,a 和 b 分别为 null 和 undefined,因此 a ?? b 的结果是 undefined。c 是一个合法的字符串,因此 a ?? c 的结果为 'foo'。而对于 d ?? c,虽然 d 的值为 0,但它不属于“nullish”值,因此返回值是 0 而非 c。

需要注意的是,nullish 合并运算符只对两个表达式中的第一个进行判断,并不会对后面的表达式做任何处理或计算。如果需要同时比较多个表达式,需要用到括号和“||”运算符组合起来。例如:

const a = undefined; const b = 0; const c = 'foo'; const d = null;

console.log((a || b) ?? (c || d)); // 输出: 0

在这个例子中,我们首先计算了两组表达式:(a || b) 和 (c || d)。第一组表达式的返回值是 0,因为 undefined || 0 的结果为 0。然后,我们使用 nullish 合并运算符 ??,选取第一组表达式作为返回值,因为它不为“nullish”,而第二组表达式中的 c 值非常明显不为“nullish”。

  1. nullish 合并运算符的进阶应用和示例

除了基本用法之外,nullish 合并运算符还支持一些进阶的应用和语法,可以进一步提高代码的可读性和灵活性。以下是一些示例:

3.1 支持函数默认参数值

在 ES6/ES7 中,我们可以使用函数默认参数值来设置函数的默认值,但是在某些情况下需要支持额外的边界参数,需要用到 nullish 合并运算符。例如:

function doSomething(value, option = {}) { const {prefix, suffix} = option; const result = value.trim();

return ${prefix ?? 'Hello'}, ${result}, ${suffix ?? 'World'}; }

console.log(doSomething(' JS')); // 输出: Hello, JS, World

在这个例子中,我们定义了一个 doSomething 函数,接受一个字符串 value 和一个 option 对象作为参数。如果 option 为“nullish”值,那么我们将它默认设置为空对象。然后,我们将 option 解构成 prefix 和 suffix 两个变量,使用 nullish 合并运算符 ??,将它们的默认值设置为“Hello”和“World”。

通过这种方式,我们可以简化函数的定义和调用,并且增强了函数的兼容性和健壮性。例如,当我们调用 doSomething(' JS', {prefix:'Hi'}) 时,它的返回值应该是 Hi, JS, World。

3.2 支持多个 nullish 合并运算符的组合

在某些场景下,我们需要同时判断多个变量或对象是否为“nullish”值,需要使用多个 nullish 合并运算符的组合。例如:

const a = undefined; const b = null; const c = {}; const d = ''; const e = 0;

console.log(a ?? b ?? c ?? d ?? e); // 输出: {}

在这个例子中,我们定义了一个 a 到 e 的变量,分别赋值为 undefined、null、空对象、空字符串和数字 0。然后,我们使用多个 nullish 合并运算符 ??,对它们进行比较。最终,我们选取第一个不为“nullish”的表达式作为返回值,即 c。

通过这种方式,我们可以快速和灵活地比较多个变量或对象,并将结果组合成一个可用的对象或值。例如,当我们需要比较多个参数的默认值时,可以使用类似的语法:

function doAnotherThing(firstVal, secondVal, thirdVal) { const result = firstVal ?? secondVal ?? thirdVal ?? 'default';

return result.toUpperCase(); }

console.log(doAnotherThing('', null, 0)); // 输出: DEFAULT

在这个例子中,我们定义了一个 doAnotherThing 函数,接受三个参数:firstVal、secondVal 和 thirdVal。然后,我们使用 nullish 合并运算符 ??,将它们的默认值设置为相应的参数值。最终,我们选取第一个不为“nullish”的参数作为返回值,并将它转换成大写格式。

  1. 总结和建议

在本文中,我们讲解了 ECMAScript 2019 中的 nullish 合并运算符的基本用法、语法和应用,以及进一步的示例和建议。通过学习这个新特性,我们可以更加准确和直观地处理 null 和 undefined 值,并在编写代码时提高效率和可读性。

对于前端开发人员,建议在使用 nullish 合并运算符时,注意以下的一些事项:

  • 在处理边界值或默认参数时,尽量使用 nullish 合并运算符,以避免出现“短路”的错误结果;
  • 在多个 nullish 合并运算符组合时,考虑使用括号和注释来增加代码的可读性;
  • 在使用 nullish 合并运算符时,尽量避免混合使用其他逻辑运算符,以避免出现意外问题和错误。

当然,nullish 合并运算符只是 ECMAScript 2019 中的一个新特性,我们还需要结合其他语言特性和开发经验来编写高效和优雅的 JavaScript 代码。希望本文对您有所启发和帮助!

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65463abc7d4982a6eb0108fa


猜你喜欢

  • 在 Sass 中添加 SVG 元素

    SVG(Scalable Vector Graphics)是一种基于 XML 的标记语言,用于描述二维图形和图形应用程序。在前端开发过程中,我们经常需要在页面中添加 SVG 元素来实现图形和图标的展示...

    1 年前
  • ES7 的 Iterator 和 for/of 循环简介

    前端开发中,循环操作是一项基础的技能。传统的 for 循环语句虽然是实现逻辑简单,但是其语法繁琐,使用起来不太方便,而且在操作复杂数据结构时会变得非常难以维护。为了解决这些问题,ES6 中引入了迭代器...

    1 年前
  • 在 Tailwind CSS 中如何使用浏览器默认样式

    Tailwind CSS 是一个强大的 CSS 框架,它提供了大量的实用类,以便您快速创建灵活的 UI 组件。然而,有时候您可能需要使用浏览器默认样式,而不是使用 Tailwind CSS 提供的预定...

    1 年前
  • 在 Jest 中如何进行代码覆盖率测试?

    在前端开发中,我们经常使用测试来保证代码质量和可靠性。而在测试中,代码覆盖率测试是一项非常重要的测试,它可以帮助开发者了解测试的覆盖范围以及测试用例是否充分覆盖了代码。

    1 年前
  • Mocha 测试框架的入门教程

    Mocha 是一个广泛使用的 JavaScript 测试框架,它具有丰富的功能和良好的可扩展性。本文将介绍如何使用 Mocha 来编写前端代码的测试用例。 安装 Mocha 使用 npm 安装 Moc...

    1 年前
  • Docker 容器内没有 ping 命令怎么办?

    如果你在使用 Docker 构建镜像或者启动容器的过程中遇到一个问题,那就是容器内没有 ping 命令。这在网络调试或者测试的时候会非常不方便。 我们今天就来讨论在 Docker 容器内没有 ping...

    1 年前
  • Webpack 如何正确编译单文件组件

    Webpack 是一个现代化的前端打包工具,可以将多个 JavaScript 文件合并成一个文件,同时支持处理 CSS、图片、字体等文件。单文件组件 (Single File Component) 是...

    1 年前
  • Koa 项目中如何使用 Koa-body 进行文件上传

    Koa 是一个基于 Node.js 平台的下一代 web 框架。它采用了异步的方式处理请求,并且使用了 JavaScript Generator 的语法来实现这个过程,让开发者摆脱了回调的噩梦,提高了...

    1 年前
  • AngularJS:AngularJS 应用中的数据与视图的绑定原理和实现方式

    在 AngularJS 中,数据与视图之间的绑定是一个非常重要的概念。当数据变化时,AngularJS 会自动更新视图,反之亦然,这使得开发者可以更加专注于逻辑的编写,而不必过多的关注 DOM 的操作...

    1 年前
  • 在使用 Headless CMS 时如何处理单点登录

    引言 在当今数字化的时代,随着新型技术的快速普及,Headless CMS 的概念越来越受到开发者的关注,尤其是在前端领域,开发者们追求更加丰富的交互式用户体验,而 Headless CMS 也正是为...

    1 年前
  • CSS Flexbox 对于响应式设计的重要性

    在前端开发中,CSS Flexbox 可以说是一种非常实用的布局方式,它能帮助开发者轻松地创建响应式布局,同时兼顾兼容性和可维护性。在本文中,我们将探讨 CSS Flexbox 在响应式设计中的重要性...

    1 年前
  • 从 ES6 到 ES11:JavaScript 新功能快速指南

    从 ES6 到 ES11:JavaScript 新功能快速指南 JavaScript 是一门非常流行的编程语言,随着 Web 应用的日益普及,JavaScript 的使用也越来越广泛。

    1 年前
  • 使用 Web Components 构建高可重用组件

    在现代 Web 开发中,我们经常需要构建各种各样的组件来实现特定的功能。这些组件可能包括拖拽、下拉刷新、日期选择器等。使用 Web Components 技术可以让我们更轻松地构建这些组件,并让它们更...

    1 年前
  • Deno 中如何使用 WebSocket 实现多人实时协作?

    近些年来,WebSocket 技术的发展已经引起了越来越多开发者的关注,它可以在浏览器和服务器之间建立“双向通信”连接,为实时在线应用提供了一个快速、可靠且高效的解决方案。

    1 年前
  • SSE(Server-Sent Events 服务端发送事件)知识总结

    SSE 是指通过 HTTP 协议,从服务端向客户端实时推送数据,同时也支持跨域访问。SSE 功能类似于 WebSocket,但是相比 WebSocket 更加简单和轻量。

    1 年前
  • 如何在 Webpack 中使用 ESLint 和 TypeScript

    前端开发中,代码的规范化是一个很重要的问题。ESLint 是一个用来检查 JavaScript 代码是否符合规范的工具,而 TypeScript 则可以让我们在开发过程中更加安全地使用 JavaScr...

    1 年前
  • Babel 插件开发:如何运用 Visitor 设计模式

    前端开发中,Babel 可以将高版本的 JavaScript 转换为低版本的 JavaScript,使得开发者可以使用最新的语法特性,同时还能兼容老旧浏览器。而 Babel 插件则可以为 Babel ...

    1 年前
  • Cypress 测试框架中的优化技巧

    前言 Cypress 是一个流行的前端测试框架,它为开发人员提供了创建端到端测试的简单和快捷方式。它是基于 JavaScript 和 Node.js 的,使用了 Mocha、Chai 和 Sinon ...

    1 年前
  • 在 PWA 应用中使用 Redux

    简介 随着 PWA 技术的不断发展,越来越多的 Web 应用开始采用 PWA 技术来实现离线访问、快速响应等优秀的用户体验。Redux 是一种基于 Flux 架构的应用数据流管理工具,广泛用于 Rea...

    1 年前
  • TypeScript 中如何进行性能测试

    在前端开发中,性能测试是非常重要的。性能测试可以帮助我们发现代码中的潜在瓶颈,从而提升应用的性能和用户体验。在 TypeScript 中进行性能测试也非常重要,因为 TypeScript 是 Java...

    1 年前

相关推荐

    暂无文章