Javascript Null Coalescing (空值合并)

2025 年 4 月 18 日 | 阅读 6 分钟

空值合并运算符(??)是 JavaScript 中一个简单而强大的语言新增功能,它使处理 null 和 undefined 值变得轻而易举。

无论您是否正在使用它,空值合并运算符都有助于处理配置对象、API 响应和可选参数。它能简化您的代码、减少错误并提高可维护性。它与其他“现代”JavaScript 功能(主要是可选链)的互补性,使其功能更加多样化。

语法

value1: 左侧操作数。

value2: 备用值(右侧操作数)。

如果 value1 是 null 或 undefined,运算符的计算结果为 value2。

否则,所有其他值(即使是 false、0 或 '')都会被计算为 value1。

在编程中,开发人员经常需要有意地将变量保留为 null 或 undefined。当输入是用户输入、配置设置或 API 响应,并且预期会出现缺失或未初始化的值时,尤其会发生这种情况。历史上,Javascript 开发人员曾使用逻辑或运算符(||)在我们没有得到值时提供一个备用值。然而,这通常不精确,导致意外行为和复杂的代码变通方案。

空值合并的用例

设置默认值

空值合并运算符最直接的用例是为一个可能是 null 或 undefined 的变量提供一个默认值。

处理可选参数

当函数中的可选参数未被传递或被明确设置为 undefined 时,我们可以使用 ?? 来处理这种情况。

安全访问配置值

有时,配置设置没有完全定义。使用空值合并运算符,您可以简化并为这些设置提供默认值,就好像说“它是空值,或者它就是这个值!”

举个例子,考虑一个返回用户数据的用户 API。响应可能包含姓名、年龄和偏好等字段。在某个字段未提供(例如,undefined)或被有意设置为 null 的情况下,空值合并运算符为开发人员提供了一种提供有意义的默认值的方法。也就是说,开发人员可以这样做,而不会无意中覆盖有效的值,如空字符串或 0。

这使得某个功能不仅更容易编码,同时也更具可读性。另一方面,运算符的意图对于开发人员来说是立即可理解的,他们能明白为什么需要这个运算符,并能更快地在协作和维护大型代码库中工作。

空值合并的必要性

在实现空值合并运算符之前,开发人员通常使用或运算符来返回一个默认值。或运算符将除了假值(falsy values)之外的所有东西都视为假:null、undefined、0、false、NaN 和 ""。当你试图将有效的假值作为假值处理时,这会导致它们被错误地覆盖。

或运算符的问题

在这里,或运算符没有将 0(一个有效的假值)视为假,并且仍然分配了备用值 10。

不幸的是,这并没有解决问题,因为有效的假值保持不变,而空值合并运算符只处理 null 和 undefined。

使用空值合并运算符

空值合并的高级功能

1. 与可选链结合

在使用深度嵌套的对象时,将空值合并运算符 (??) 与可选链 (?.) 结合起来是安全的,它们创建了一种安全访问属性的方式。通过防止在访问 null 或 undefined 的属性时出错,可选链和 ?? 在目标属性本身被发现为 null 或 undefined 时提供了一个备用方案。

2. 链接多个备用值

?? 运算符可以被链接起来以创建分层的备用方案。当可能有多个潜在的值来源时,这很有用。

3. 安全的默认赋值

在解构对象时,空值合并运算符可以与默认值结合使用,以执行合理的赋值而不会出错。

4. 复杂表达式

只要优先级正确,空值合并运算符可以与复杂表达式一起使用,并可以与 && 和 || 结合使用。

5. 函数中的动态默认值

当您希望在函数中拥有动态默认值并使用可选参数来实现时,它非常宝贵。

在 JavaScript 应用程序中的综合成果

输入验证

在面向用户的应用程序中,您很可能会看到缺失或不完整的输入。空值合并运算符提供了一种简单的方法来处理这种情况,而不是使用冗长的验证逻辑。如果没有默认值,当用户输入为 null 或 undefined 时,应用程序可能会出现不可预测的行为,这可能导致糟糕的用户体验——即使您不需要编写它。

配置管理

在许多应用程序中,配置设置用于确定运行时的行为。在某些环境中,这些设置本身可能缺少一些可选参数。使用空值合并运算符,为这些参数提供合理的默认值变得非常简单,从而防止应用程序变得过于复杂。

API 集成

从本质上讲,它们经常处理外部 API 返回的值中包含不完整或缺失字段的数据。空值合并运算符使我们能够为这些字段设置有意义的默认值,以便我们的应用程序可以优雅地处理 API 响应。这可以防止来自外部源的劣质数据造成的破坏性影响,从而提高稳健性,并减少因外部源的部分错误或错误数据而导致的故障发生率。

输入验证

在面向用户的应用程序中,您很可能会看到缺失或不完整的输入。空值合并运算符提供了一种简单的方法来处理这种情况,而不是使用冗长的验证逻辑。如果没有默认值,当用户输入为 null 或 undefined 时,应用程序可能会出现不可预测的行为,这可能导致糟糕的用户体验——即使您不需要编写它。

动态数据处理

在数据驱动的应用程序中,我们倾向于处理具有部分填充字段的对象。空值合并运算符简化了为这些字段分配备用值的代码,使其比传统的数据处理逻辑更容易理解。在处理预期会出现缺失字段的动态或不断演变的数据结构时,此功能尤为重要。

空值合并运算符有助于解决这些常见问题,从而提高 JavaScript 应用程序的可读性、可维护性和可靠性,使其成为我们现代开发中必不可少的工具。

程序

输出

 
Hello, Guest!
Hello, Alice!
Hi, Guest! 

结论

它是 JavaScript 中处理可能缺失、未定义或为空的值的一个重要而强大的功能。空值合并运算符简化了为这些字段分配备用值的代码,使其比传统的数据处理逻辑更容易理解。在处理预期会出现缺失字段的动态或不断演变的数据结构时,此功能尤为重要。

最后,空值合并运算符使绝大多数处理数据的 JavaScript 代码能够更优雅、更易于维护地处理数据缺失或未定义的情况。