試一試
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 |
瀏覽器相容性
載入中…