void 运算符

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

void 运算符会计算给定的 expression,然后返回 undefined

试一试

const output = void 1;
console.log(output);
// Expected output: undefined

void console.log("expression evaluated");
// Expected output: "expression evaluated"

void (function iife() {
  console.log("iife is executed");
})();
// Expected output: "iife is executed"

void function test() {
  console.log("test function executed");
};
try {
  test();
} catch (e) {
  console.log("test function is not defined");
  // Expected output: "test function is not defined"
}

语法

js
void expression

描述

此运算符允许在需要表达式计算结果为 undefined 的地方,计算产生值的表达式。

void 运算符通常仅用于获取 undefined 基本类型值,通常使用 void(0)(等同于 void 0)。在这些情况下,可以使用全局变量 undefined

需要注意的是,void 运算符的优先级应该被考虑到,并且括号可以帮助澄清 void 运算符后面的表达式的解析。

js
void 2 === "2"; // (void 2) === '2', returns false
void (2 === "2"); // void (2 === '2'), returns undefined

示例

立即调用函数表达式

在使用立即调用函数表达式时,function 关键字不能直接出现在语句的开头,因为这会被解析为函数声明,当遇到表示调用的括号时会产生语法错误——如果函数是匿名的,当函数被解析为声明时,会立即产生语法错误。

js
function iife() {
  console.log("Executed!");
}(); // SyntaxError: Unexpected token ')'

function () {
  console.log("Executed!");
}(); // SyntaxError: Function statements require a function name

为了使函数被解析为表达式function 关键字必须出现在只接受表达式而不是语句的位置。这可以通过在关键字前加上一元运算符来实现,一元运算符只接受表达式作为操作数。函数调用比一元运算符具有更高的优先级,因此它会首先执行。它的返回值(几乎总是 undefined)将被传递给一元运算符,然后立即丢弃。

在所有一元运算符中,void 提供了最好的语义,因为它清楚地表明函数调用的返回值应该被丢弃。

js
void function () {
  console.log("Executed!");
}();

// Logs "Executed!"

这比用括号包裹函数表达式要长一些,但它们具有相同的效果,即强制将 function 关键字解析为表达式的开始而不是语句。

js
(function () {
  console.log("Executed!");
})();

请注意,此技巧仅适用于使用 function 关键字定义的 IIFE。尝试使用 void 运算符来避免箭头函数的括号会导致语法错误。箭头函数表达式在被调用时总是需要用括号括起来。

js
void () => { console.log("iife!"); }(); // SyntaxError: Malformed arrow function parameter list

JavaScript URI

当浏览器遵循 javascript: URI 时,它会评估 URI 中的代码,然后用返回值替换页面内容,除非返回值是 undefinedvoid 运算符可用于返回 undefined。例如:

html
<a href="javascript:void(0);">Click here to do nothing</a>

<a href="javascript:void(document.body.style.backgroundColor='green');">
  Click here for green background
</a>

注意:不建议使用 javascript: 伪协议,而是使用其他替代方案,例如非侵入式事件处理程序。

无副作用的箭头函数

箭头函数引入了一种简洁的无花括号语法,它会返回一个表达式。如果该表达式是一个函数调用,并且返回值从 undefined 变为其他值,这可能会导致意外的副作用。

例如,如果下面的代码中 doSomething() 返回 false,当点击复选框时,复选框将不再被标记为选中或未选中(从处理程序返回 false 会禁用默认操作)。

js
checkbox.onclick = () => doSomething();

这不太可能是期望的行为!为了安全起见,当不打算使用函数的返回值时,可以将其传递给 void 运算符,以确保(例如)API 的更改不会导致箭头函数的行为发生变化。

js
checkbox.onclick = () => void doSomething();

规范

规范
ECMAScript® 2026 语言规范
# sec-void-operator

浏览器兼容性

另见