试一试
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"
}
语法
void expression
描述
此运算符允许在需要表达式计算结果为 undefined 的地方,计算产生值的表达式。
void 运算符通常仅用于获取 undefined 基本类型值,通常使用 void(0)(等同于 void 0)。在这些情况下,可以使用全局变量 undefined。
需要注意的是,void 运算符的优先级应该被考虑到,并且括号可以帮助澄清 void 运算符后面的表达式的解析。
void 2 === "2"; // (void 2) === '2', returns false
void (2 === "2"); // void (2 === '2'), returns undefined
示例
立即调用函数表达式
在使用立即调用函数表达式时,function 关键字不能直接出现在语句的开头,因为这会被解析为函数声明,当遇到表示调用的括号时会产生语法错误——如果函数是匿名的,当函数被解析为声明时,会立即产生语法错误。
function iife() {
console.log("Executed!");
}(); // SyntaxError: Unexpected token ')'
function () {
console.log("Executed!");
}(); // SyntaxError: Function statements require a function name
为了使函数被解析为表达式,function 关键字必须出现在只接受表达式而不是语句的位置。这可以通过在关键字前加上一元运算符来实现,一元运算符只接受表达式作为操作数。函数调用比一元运算符具有更高的优先级,因此它会首先执行。它的返回值(几乎总是 undefined)将被传递给一元运算符,然后立即丢弃。
在所有一元运算符中,void 提供了最好的语义,因为它清楚地表明函数调用的返回值应该被丢弃。
void function () {
console.log("Executed!");
}();
// Logs "Executed!"
这比用括号包裹函数表达式要长一些,但它们具有相同的效果,即强制将 function 关键字解析为表达式的开始而不是语句。
(function () {
console.log("Executed!");
})();
请注意,此技巧仅适用于使用 function 关键字定义的 IIFE。尝试使用 void 运算符来避免箭头函数的括号会导致语法错误。箭头函数表达式在被调用时总是需要用括号括起来。
void () => { console.log("iife!"); }(); // SyntaxError: Malformed arrow function parameter list
JavaScript URI
当浏览器遵循 javascript: URI 时,它会评估 URI 中的代码,然后用返回值替换页面内容,除非返回值是 undefined。void 运算符可用于返回 undefined。例如:
<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 会禁用默认操作)。
checkbox.onclick = () => doSomething();
这不太可能是期望的行为!为了安全起见,当不打算使用函数的返回值时,可以将其传递给 void 运算符,以确保(例如)API 的更改不会导致箭头函数的行为发生变化。
checkbox.onclick = () => void doSomething();
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-void-operator |
浏览器兼容性
加载中…