Movatterモバイル変換


[0]ホーム

URL:


  1. 面向开发者的 Web 技术
  2. JavaScript
  3. JavaScript 参考
  4. 表达式和运算符
  5. 空值合并运算符(??)

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in EnglishAlways switch to English

空值合并运算符(??)

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨2020年7月⁩.

空值合并运算符??)是一个逻辑运算符,当左侧的操作数为null 或者undefined 时,返回其右侧操作数,否则返回左侧操作数。

尝试一下

const foo = null ?? "default string";console.log(foo);// Expected output: "default string"const baz = 0 ?? 42;console.log(baz);// Expected output: 0

语法

js
leftExpr ?? rightExpr

描述

空值合并运算符可以视为逻辑或运算符(||的特例。后者在左侧操作数为任何假值时返回右侧操作数,而不仅仅是nullundefined。换句话说,如果你使用|| 为另一个变量foo 提供某些默认值,而你将某些假值视为可用值(例如''0),则可能会遇到意外的行为。更多示例参见下方

空值合并运算符的运算符优先级是第五低的,直接低于|| 且直接高于条件(三元)运算符

?? 直接与逻辑与(&&)和逻辑或(||)运算符组合使用是不可取的。这种情况下会抛出语法错误

js
null || undefined ?? "foo"; // 抛出 SyntaxErrortrue && undefined ?? "foo"; // 抛出 SyntaxError

相反,请提供括号以明确表示优先级:

js
(null || undefined) ?? "foo"; // 返回“foo”

示例

使用空值合并运算符

在这个例子中,我们使用空值合并运算符为常量提供默认值,保证常量不为null 或者undefined

js
const nullValue = null;const emptyText = ""; // 假值const someNumber = 42;const valA = nullValue ?? "valA 的默认值";const valB = emptyText ?? "valB 的默认值";const valC = someNumber ?? 0;console.log(valA); // "valA 的默认值"console.log(valB); // ""(空字符串虽然是假值,但不是 null 或者 undefined)console.log(valC); // 42

为变量赋默认值

以前,如果想为一个变量赋默认值,通常的做法是使用逻辑或运算符(||):

js
let foo;// foo 从未被赋予任何值,因此它仍然是未定义的let someDummyText = foo || "Hello!";

然而,由于|| 是一个布尔逻辑运算符,左侧的操作数会被强制转换成布尔值用于求值。任何假值0''NaNfalse等等)都不会被返回。如果你使用0''NaN 作为有效值,就会出现不可预料的后果。

js
const count = 0;const text = "";const qty = count || 42;const message = text || "hi!";console.log(qty); // 42,而不是 0console.log(message); // "hi!",而不是 ""

空值合并运算符可以避免这种陷阱,其只在第一个操作数为nullundefined 时(而不是其他假值)返回第二个操作数:

js
const myText = ""; // 空字符串(其也是假值)const notFalsyText = myText || "Hello world";console.log(notFalsyText); // Hello worldconst preservingFalsy = myText ?? "Hi neighborhood";console.log(preservingFalsy); // ''(myText 既不是 undefined 也不是 null)

短路

与 OR 和 AND 逻辑运算符相似,当左表达式不为nullundefined 时,不会对右表达式进行求值。

js
function A() {  console.log("函数 A 被调用了");  return undefined;}function B() {  console.log("函数 B 被调用了");  return false;}function C() {  console.log("函数 C 被调用了");  return "foo";}console.log(A() ?? C());// 依次打印 "函数 A 被调用了"、"函数 C 被调用了"、"foo"// A() 返回了 undefined,所以运算符两边的表达式都被执行了console.log(B() ?? C());// 依次打印 "函数 B 被调用了"、"false"// B() 返回了 false(既不是 null 也不是 undefined)// 所以右侧表达式没有被执行

与可选链运算符(?.)的关系

空值合并运算符将undefinednull 视为特殊值,可选链运算符(?.也是如此。该运算符在访问可能为nullundefined 的对象属性时非常有用。将这两者结合,可以安全地访问可能为空值的对象属性,并在其为空值时提供默认值。

js
const foo = { someFooProp: "hi" };console.log(foo.someFooProp?.toUpperCase() ?? "not available"); // "HI"console.log(foo.someBarProp?.toUpperCase() ?? "not available"); // "not available"

规范

Specification
ECMAScript® 2026 Language Specification
# prod-CoalesceExpression

浏览器兼容性

参见

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp