JavaScript双问号操作符(??)的惊人用法总结大全

 更新时间:2025年06月30日 11:39:51   投稿:daisy  
双问号操作符是ES2020引入的一个用于处理变量默认值的新特性,与传统的逻辑或操作符||不同,这篇文章主要介绍了JavaScript双问号操作符(??)详解及如何解决使用||时因类型转换带来的问题,需要的朋友可以参考下

前言

JavaScript作为一门不断发展的语言,总是在引入新特性来解决开发者的痛点。其中,ES2020引入的空值合并操作符(Nullish Coalescing Operator),即双问号操作符(??),是一个简单却极其强大的工具,彻底改变了我们处理默认值和空值的方式。

1. 基本概念:什么是??操作符

双问号操作符(??)是一个逻辑操作符,当左侧操作数为null或undefined时,返回右侧操作数,否则返回左侧操作数。这看似简单,但与我们常用的逻辑或操作符(||)有着本质区别。

const value1 = null ?? 'default';        // 'default'
const value2 = undefined ?? 'default';    // 'default'
const value3 = false ?? 'default';        // false
const value4 = 0 ?? 'default';            // 0
const value5 = '' ?? 'default';           // ''

2. ??与||的关键区别

在了解??操作符的强大之前,我们需要理解它与||操作符的区别:

// 使用||
const count = userCount || 10;  // 当userCount为0时,count将为10

// 使用??
const count = userCount ?? 10;  // 当userCount为0时,count将为0

||操作符会将所有"假值"(如0、''、false、NaN等)都视为需要使用默认值的情况,而??操作符只在值为null或undefined时才使用默认值。

3. 实际应用

(1) 表单处理中的默认值

function processForm(data) {
  // 只有当值真正缺失时才使用默认值
  const username = data.username ?? 'guest';
  const items = data.items ?? [];
  const quantity = data.quantity ?? 1;  // 允许quantity为0
  
  // 处理表单逻辑...
}

(2) 配置对象的深层默认值

const config = {
  server: {
    port: 0,  // 有效值,但为"假值"
    host: ''  // 有效值,但为"假值"
  }
};

const userConfig = {};

// 正确处理深层配置
const port = userConfig?.server?.port ?? config.server.port;  // 0
const host = userConfig?.server?.host ?? config.server.host;  // ''

(3) API响应处理

(4) 链式默认值

??操作符可以链式使用,创建一个"默认值瀑布":

(5) 与可选链操作符(?.)完美配合

当与可选链操作符(?.)结合使用时,处理复杂嵌套对象变得异常优雅:

const userName = user?.profile?.preferences?.displayName ?? 'Guest';

这行代码可以安全地深入访问一个可能不存在的嵌套属性,并在任何一层为null或undefined时提供默认值。

(6) 条件性执行函数

// 仅当handler存在时才执行,否则使用默认处理函数
(customHandler ?? defaultHandler)(event);

(7) 数组元素的默认值处理

4. 高级技巧

(1) 结合解构赋值

const { name, age, title = 'Developer', company = 'Unknown' } = employee ?? {};

这个模式不仅能处理employee为null/undefined的情况,还为解构出的个别属性提供默认值。

(2) 在类中使用

class UserPreferences {
  constructor(settings) {
    this.theme = settings?.theme ?? 'light';
    this.fontSize = settings?.fontSize ?? 16;
    this.notifications = settings?.notifications ?? true;
    
    // 即使settings.volume为0也会被保留
    this.volume = settings?.volume ?? 0.5;
  }
}

5. 性能考虑

??操作符不仅语法简洁,在某些情况下还能带来性能优势。由于它只检查null和undefined,比||操作符的类型转换操作更高效。

双问号操作符(??)虽然看似简单,却解决了JavaScript中一个长期存在的痛点:如何正确处理"空值"与"假值"的区别。

总结

到此这篇关于JavaScript双问号操作符(??)惊人用法的文章就介绍到这了,更多相关JS 双问号操作符??用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 给自定义对象加上自定义事件的支持的教程

    给自定义对象加上自定义事件的支持的教程

    自从我写了几个还可以拿出手的东东之后,自我感觉牛B了许多,还有不少同志围着我,称我为高手,虚容心大大的得到了满足。这些是后话,暂且不表。。。
    2008-03-03
  • javascript 读取XML数据,在页面中展现、编辑、保存的实现

    javascript 读取XML数据,在页面中展现、编辑、保存的实现

    最近需要做这样一个需求,数据保存在XML里,在页面上通过表格显示其内容,可以修改内容,再保存到XML。下面把做这个东西的过程记录下来,做个笔记,也给需要的人一些帮助。
    2009-10-10
  • JS项目中对本地存储进行二次的封装的实现

    JS项目中对本地存储进行二次的封装的实现

    这篇文章主要介绍了JS项目中对本地存储进行二次的封装,这里我们将要使用到的key存储下来,新建一个叫constant-storage.js的文件,对外暴露一些key的键名,也方便后期统一修改,这里因为都是恒量,所以名称我们都用大写表示,需要的朋友可以参考下
    2022-07-07
  • javascript实现颜色渐变的方法

    javascript实现颜色渐变的方法

    这篇文章介绍了javascript实现颜色渐变的方法,有需要的朋友可以参考一下
    2013-10-10
  • 微信小程序实现瀑布流布局与无限加载的方法详解

    微信小程序实现瀑布流布局与无限加载的方法详解

    瀑布流布局是我们日常开发中经常见到的一种页面布局方式,下面这篇文章主要给大家介绍了微信小程序实现瀑布流布局与无限加载的相关资料,文中给出了详细介绍和示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-05-05
  • JavaScript中极易出错的操作符运算总结

    JavaScript中极易出错的操作符运算总结

    这篇文章主要给大家介绍了关于JavaScript中极易出错的操作符运算的相关资料,包括了算术运算符、比较运算符、逻辑运算符、赋值运算符、一元运算符以及运算优先级等问题,需要的朋友可以参考下
    2021-08-08
  • wordpress之js库集合研究介绍

    wordpress之js库集合研究介绍

    wordpress之js库集合研究介绍...
    2007-08-08
  • JS判断数据类型的常用方法汇总

    JS判断数据类型的常用方法汇总

    判断数据类型是JavaScript面试时常常遇到的问题,本文为大家总结了几种常用的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-06-06
  • JS使用Date对象实时显示当前系统时间简单示例

    JS使用Date对象实时显示当前系统时间简单示例

    这篇文章主要介绍了JS使用Date对象实时显示当前系统时间,涉及javascript基于定时器动态操作Date对象相关实现技巧,需要的朋友可以参考下
    2018-08-08
  • 纯js实现瀑布流布局及ajax动态新增数据

    纯js实现瀑布流布局及ajax动态新增数据

    这篇文章主要介绍了基于javascript实现瀑布流布局,及ajax动态新增数据的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04

最新评论