当前位置: 首页 > news >正文

JavaScript ?? 运算符详解

在 JavaScript 中,??空值合并运算符(Nullish Coalescing Operator)。它用于处理 nullundefined 值,并提供一个默认值。

1. 基本语法

let result = value1 ?? value2;
  • 如果 value1 不是 nullundefined,则返回 value1
  • 如果 value1nullundefined,则返回 value2

2. 空值合并运算符的工作原理

逻辑或 (||) 运算符不同,空值合并运算符只会考虑 nullundefined,而不会将其他假值(如 false0NaN"" 空字符串等)视为需要替代的值。

示例:
let a = null;
let b = 5;
let c = undefined;
let d = 0;console.log(a ?? b);  // 5,因为 a 是 null
console.log(c ?? b);  // 5,因为 c 是 undefined
console.log(d ?? b);  // 0,因为 d 不是 null 或 undefined,而是 0
比较 ??||
let x = 0;
let y = 10;console.log(x || y);  // 10,因为 x 是假值(0)
console.log(x ?? y);  // 0,因为 x 不是 null 或 undefined

在上面的例子中:

  • 使用 || 时,x 的值为 0,它被视为假值,所以返回了 y(即 10)。
  • 使用 ?? 时,x0,它不是 nullundefined,所以返回了 0

3. 使用空值合并运算符的场景

  • 提供默认值: 当一个值可能为 nullundefined 时,可以用 ?? 来提供一个默认值。

    let userAge = null;
    let defaultAge = 18;let age = userAge ?? defaultAge;
    console.log(age);  // 18,因为 userAge 是 null
    
  • 避免无效值: 当你有多个潜在的 nullundefined 值时,可以使用空值合并运算符来选择第一个有效值。

    let firstName = null;
    let lastName = undefined;
    let defaultName = "Anonymous";let name = firstName ?? lastName ?? defaultName;
    console.log(name);  // "Anonymous" 因为 firstName 和 lastName 都是 null 或 undefined
    

4. 空值合并与可选链(?.)结合使用

空值合并运算符和可选链(?.)结合使用时,能够更安全地访问对象的属性,并且提供一个默认值。

示例:
let user = { name: "Alice" };let userAge = user?.age ?? 18;
console.log(userAge);  // 18,因为 user 对象中没有 `age` 属性,所以返回默认值 18

在这个例子中,?. 用于安全地访问 user.age,如果 age 不存在,它返回 undefined,然后 ?? 提供默认值 18

5. 空值合并运算符与其他运算符的优先级

?? 的优先级较低,因此,在表达式中使用时,通常需要加上括号来避免运算顺序错误。

示例:
let a = null;
let b = 10;console.log(a ?? b * 2);  // 20,因为先执行乘法运算,再进行空值合并
console.log((a ?? b) * 2);  // 20,先进行空值合并,再执行乘法运算

6. 兼容性

空值合并运算符(??)在 ECMAScript 2020(ES11)中被引入,因此在较旧的 JavaScript 环境中可能不被支持。如果你需要兼容较旧的浏览器或环境,可以使用 Babel 等工具进行转译。

总结:

  • ?? 运算符用于提供一个默认值,当其左侧的值为 nullundefined 时,返回右侧的默认值。
  • 它不会像 || 运算符那样将其他“假值”当作 nullundefined 处理,因此可以避免一些意外的行为。
  • 在实际开发中,它主要用于处理可能为 nullundefined 的值,并为其提供一个更合理的默认值。

相关文章:

  • 宏碁笔记本电脑怎样开启/关闭触摸板
  • 最新项目笔记
  • Qt Creator 创建 Qt Quick Application一些问题
  • C++:STL模板
  • 华为网路设备学习-19 路由策略
  • RS232转Profinet网关开启光谱仪新视界
  • 【Spring Boot】MyBatis多表查询的操作:注解和XML实现SQL语句
  • 1.HTTP协议与RESTful设计
  • 智能指针之设计模式3
  • 如何使用 Spring Boot 实现统一功能处理:从零开始打造高效、可扩展的后台系统
  • 31Calico网络插件的简单使用
  • 常用python爬虫框架介绍
  • 测试第四课---------性能测试工具
  • gbase8s触发器使用
  • 使用 LangChain + Higress + Elasticsearch 构建 RAG 应用
  • Python 获取淘宝买家订单列表(buyer_order_list)接口的详细指南
  • 【C++】新手入门指南(下)
  • 建造者模式详解及其在自动驾驶场景的应用举例(以C++代码实现)
  • C++(初阶)(十二)——stack和queue
  • container_memory_working_set_bytes` 与 `container_memory_usage_bytes` 的区别
  • 巴基斯坦航天员选拔工作正在进行,1人将以载荷专家身份参加联合飞行
  • 体坛联播|曼城击败维拉迎英超三连胜,巴萨遭遇魔鬼赛程
  • 上海34年“老外贸”张斌:穿越风暴,必须靠过硬的核心竞争力
  • 资深翻译家、斯诺研究专家安危逝世,曾为多位外国元首做口译
  • 全总:五一拟表彰全国劳模先进工作者2426名,盛李豪入选
  • 第三轮上海餐饮消费券本周五起报名,核销时间延长至6月2日