TypeScript中?.、??与??=运算符详解

作者:青柠时间:2026-10-31 10:06:07浏览:505

本文详细介绍TypeScript中三个关键运算符:可选链?.用于安全访问可能为空的属性;空值合并??提供默认值;空值合并赋值??=简化赋值逻辑。同时对比??与||的区别,帮助开发者避免运行时错误并编写更简洁的代码。

可选链运算符 (?.)

该运算符用于安全访问可能为 null 或 undefined 的属性或方法,从而避免运行时错误。若使用传统的 . 运算符访问此类值,程序会抛出异常;而使用 ?. 时,若目标值为 null 或 undefined,表达式将短路并返回 undefined,不会中断执行。示例如下:

let obj = { foo: { bar: 42 } };
let value = obj?.foo?.bar; // 如果 obj 或 obj.foo 或 obj.foo.bar 为 null 或 undefined,value 将为 undefined,否则为 42

空值合并运算符 (??)

此运算符用于为表达式提供默认值。当左侧表达式的计算结果为 null 或 undefined 时,它将返回右侧指定的默认值。若变量或表达式的值为 null 或 undefined,通过 ?? 运算符可便捷地指定备选值。示例如下:

let x = null;
let y = x ?? 5; // 如果 x 为 null 或 undefined,y 将为 5,否则为 x 的值

空值合并赋值运算符 (??=)

该运算符用于在变量值为 null 或 undefined 时,为其赋予默认值。若当前变量值为 null 或 undefined,使用 ??= 运算符可将右侧的默认值赋给该变量。示例如下:

let x = null;
x ??= 5; // 如果 x 为 null 或 undefined,将把 5 赋给 x

?? 和 || 运算符在行为上存在相似之处,但适用场景不同。

?? 和 || 的区别

假值包括 false、0、空字符串、null 和 undefined 等。?? 运算符仅在左侧操作数为 null 或 undefined 时,才返回右侧操作数;而 || 运算符在左侧操作数为任何“假值”(包括 false、0、空字符串等)时,都会返回右侧操作数。

let a:any;
let b = '1111';
let c = null;
let d:any = 0;
let e;
e ??= a?.b ?? c ?? d?.a ?? b;

a?.b:这是可选链运算符 ?. 的使用,它尝试访问变量 a 的属性 b。如果 a 为 null 或 undefined,则表达式返回 undefined。
a?.b ?? c:这是空值合并运算符 ?? 的使用,它判断左侧操作数 a?.b 是否为 null 或 undefined。如果是,则返回右侧操作数 c 的值。否则,返回左侧操作数 a?.b 的值。
a?.b ?? c ?? d?.a:继续使用空值合并运算符 ??,判断前一个表达式的结果 a?.b ?? c 是否为 null 或 undefined。如果是,则返回右侧操作数 d?.a 的值。否则,返回前一个表达式的结果。
a?.b ?? c ?? d?.a ?? b:再次使用空值合并运算符 ??,判断前一个表达式的结果 a?.b ?? c ?? d?.a 是否为 null 或 undefined。如果是,则返回右侧操作数 b 的值。否则,返回前一个表达式的结果。
根据上述表达式的逻辑,以下是对应的执行过程:

a 的值为 undefined。
a?.b 的结果为 undefined。
a?.b ?? c 的结果为 null,因为左侧操作数为 undefined,右侧操作数为 null。
a?.b ?? c ?? d?.a 的结果为 0,因为左侧操作数为 null,右侧操作数为 d?.a,而 d 的值为 0。
a?.b ?? c ?? d?.a ?? b 的结果为 '1111',因为左侧操作数为 0,右侧操作数为 '1111'。
最终,变量 e 的值被赋为 '1111'。

至此,关于 TypeScript 中 ?.、?? 和 ??= 运算符的使用步骤介绍完毕。如需了解更多 TypeScript 运算符相关内容,建议查阅本站过往文章或继续浏览后续章节。感谢支持!

作者最新文章
相关文章
更多