JavaScript 中的 ?? 运算符,你真的了解吗?
2023-09-03 05:00:27
前言
今天偶然看到一段 JavaScript 代码中使用了 ?? 运算符,当时就有点纳闷了:JavaScript 中还有这玩意?
还记得在学习 Dart 语法时也有 ?? 逻辑运算符,没管那么多,直接使用,毕竟当时在学习的新语言中,有新玩意就赶紧用嘛。
可 JavaScript,这门我不怎么想深入学习的语言,居然也会有这个东西?可见它的应用还是挺广泛的,不然也不可能这么幸运地被我撞见。
刚好有这个机会就研究一下,相信它可以解决不少痛点,所以整理了这篇文章,如有收获,还望一键三连。
正文
运算符基本介绍
JavaScript 中的 ?? 运算符是一个逻辑运算符,它用于检查左操作数是否为 null 或 undefined,如果是,则返回右操作数的值。?? 运算符的优先级高于 && 和 || 运算符,因此它可以嵌套在这些运算符中。
语法格式如下:
let result = leftOperand ?? rightOperand;
其中:
leftOperand
:要检查是否为 null 或 undefined 的值。rightOperand
:如果leftOperand
为 null 或 undefined,则返回的值。
示例:
let name = "John Doe";
let fullName = name ?? "Anonymous";
console.log(fullName); // "John Doe"
示例 2:
let age = null;
let defaultAge = 18;
let validAge = age ?? defaultAge;
console.log(validAge); // 18
运算符的应用
?? 运算符可以用于各种场景,这里列举一些最常见的用法:
- 默认值赋值: 可以使用 ?? 运算符来为变量赋值默认值,例如:
let name = "John Doe";
let fullName = name ?? "Anonymous";
console.log(fullName); // "John Doe"
- 可空类型注解: 可以使用 ?? 运算符来标注可空类型,例如:
function getName(user: { name: string | null }): string {
return user.name ?? "Anonymous";
}
let user = { name: "John Doe" };
let fullName = getName(user);
console.log(fullName); // "John Doe"
- 嵌套逻辑运算符: 可以使用 ?? 运算符来嵌套逻辑运算符,例如:
let age = 20;
let isAdult = age >= 18 ? true : age >= 13 ? "Teenager" : "Child";
console.log(isAdult); // "true"
运算符与其他运算符的比较
-
与三元运算符: ?? 运算符与三元运算符(
?:
)非常相似,它们都可以用于默认值赋值。然而,?? 运算符的语法更简洁,而且它可以嵌套在其他逻辑运算符中。 -
与 || 运算符: ?? 运算符与 || 运算符也相似,它们都可以用于求逻辑或。然而,?? 运算符的优先级高于 || 运算符,因此它可以嵌套在 || 运算符中。
-
与 && 运算符: ?? 运算符与 && 运算符也相似,它们都可以用于求逻辑与。然而,?? 运算符的优先级高于 && 运算符,因此它可以嵌套在 && 运算符中。
运算符的优点与缺点
优点:
- 语法简洁,易于阅读和理解。
- 可以嵌套在其他逻辑运算符中。
- 可以用于默认值赋值、可空类型注解和嵌套逻辑运算符。
缺点:
- 可能导致代码难以理解,特别是当嵌套使用多个 ?? 运算符时。
- 可能导致代码性能下降,因为 ?? 运算符需要检查左操作数是否为 null 或 undefined。
总结
JavaScript 中的 ?? 运算符是一个逻辑运算符,它可以提供更简洁的默认值赋值方式。?? 运算符的优先级高于 && 和 || 运算符,因此它可以嵌套在这些运算符中。
?? 运算符可以用于各种场景,包括默认值赋值、可空类型注解和嵌套逻辑运算符。与三元运算符、|| 运算符和 && 运算符相比,?? 运算符具有自己的优点和缺点。
在使用 ?? 运算符时,应权衡其优点和缺点,并根据具体情况决定是否使用它。