void 运算符

**void** 运算符计算给定的 表达式,然后返回 undefined

试试看

语法

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!");
})();

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 语言规范
# sec-void-operator

浏览器兼容性

BCD 表仅在浏览器中加载。

另请参阅