JavaScriptの void演算子 は、あらゆる式を評価した上で常に undefined を返す単項演算子です。最もよく見かけるのは href="javascript:void(0)" のパターンですが、void演算子にはそれ以外にも重要な使い道があります。
この記事では、void演算子の基本的な仕組みから、void 0 による安全なundefined取得、IIFE(即時実行関数)での活用、アロー関数との組み合わせ、そしてモダンな代替手段まで体系的に解説します。
この記事で学べること
- void演算子の基本構文と「常にundefinedを返す」仕組み
- void 0 で安全にundefinedを取得する理由(ES5以前の歴史)
- javascript:void(0) の仕組みとリンク無効化パターン
- IIFE(即時実行関数)を void で書くテクニック
- アロー関数の戻り値を無視する void の活用法
- モダンなJavaScript/HTMLにおける代替手段
- ESLint no-void ルールとベストプラクティス
void演算子の基本構文
void は単項演算子です。右辺の式を評価した後、常に undefined を返します。
基本構文
// 構文: void 式
void 0; // undefined
void(0); // undefined(括弧は任意)
void 'hello'; // undefined
void true; // undefined
void []; // undefined
void {}; // undefined
void (1 + 2); // undefined(式は評価されるが結果は捨てられる)
void alert('Hi'); // undefined(alertは実行される)
? 重要ポイント:void は「式を無視する」のではなく、「式を評価した上で結果をundefinedに置き換える」演算子です。関数呼び出しなどの副作用は実行されます。
void(0) と void 0 は同じ
// 括弧は演算子の優先順位を制御するだけ
// void(0) は void (0) と同じで、関数呼び出しではない
console.log( void 0 === void(0) ); // true
console.log( void 0 === undefined ); // true
// typeof でも undefined
console.log( typeof void 0 ); // "undefined"
関連記事:JavaScript演算子の使い方と例まとめ
void 0 で安全にundefinedを取得する
void 0 が最もよく使われる理由は、確実にundefinedを取得できるからです。
ES5以前の問題:undefinedは上書き可能だった
ES5以前の危険なコード
// ES5以前では undefined はグローバルオブジェクトの書き換え可能なプロパティだった
undefined = 'not undefined!'; // ES5以前では可能だった!
// そのため undefined を使った比較が壊れる可能性があった
if (value === undefined) { // 信頼できない
// ...
}
// void 0 なら常に本物の undefined を返す
if (value === void 0) { // 常に安全
// ...
}
⚠ 現在のJavaScript(ES5+):グローバルの undefined は書き換え不可(non-writable)になりました。ただし、ローカルスコープではundefinedという変数名を使えてしまうため、厳密にはまだvoid 0の方が安全です。
現在でも起こりうるケース
// ローカルスコープでは undefined を変数名として使えてしまう
(function() {
var undefined = 'oops'; // エラーにならない!
console.log(undefined); // "oops"
console.log(void 0); // undefined(本物)
})();
// ミニファイ(圧縮)ツールが void 0 を使う理由
// "undefined" → 9文字
// "void 0" → 6文字 ← 3文字節約
// UglifyJS / Terser などが undefined を void 0 に置換する
| 方法 |
安全性 |
バイト数 |
備考 |
void 0 |
✅ 常に安全 |
6 |
ミニファイ後のコードで頻出 |
undefined |
⚠ ローカルで上書き可能 |
9 |
ES5+のグローバルは安全 |
typeof x === "undefined" |
✅ 常に安全 |
多い |
未宣言の変数にも安全に使える |
関連記事:undefinedの意味と使い方
javascript:void(0) の仕組み
HTML の <a> タグで最もよく見かけるvoidの用法です。リンクのクリック時にページ遷移やリロードを防ぎます。
javascript:void(0) の基本パターン
<!-- クリックしてもページ遷移しない -->
<a href="javascript:void(0);" onclick="doSomething()">クリック</a>
<!-- void(0) がないと、戻り値があるときにページが書き換わる -->
<a href="javascript:'Hello'">クリック</a>
<!-- ↑ クリックするとページが "Hello" という文字だけのページになる -->
なぜ javascript:void(0) でページ遷移が防げるのか?
Step 1: ブラウザが href="javascript:..." を検出
Step 2: javascript: の後の式 void(0) を評価
Step 3: void(0) → undefined が返る
Step 4: 戻り値が undefined の場合、ブラウザはページ遷移しない
javascript:href の戻り値による動作の違い
<!-- 戻り値: undefined → ページ遷移しない -->
<a href="javascript:void(0)">安全</a>
<!-- 戻り値: undefined → alert()はundefinedを返す -->
<a href="javascript:alert('Hi')">安全(alertの戻り値はundefined)</a>
<!-- 戻り値: 文字列 → ページが書き換わる! -->
<a href="javascript:'Hello World'">危険</a>
<!-- 戻り値: 数値 → ページが書き換わる! -->
<a href="javascript:1+2">危険(ページが "3" になる)</a>
関連記事:aタグのリンクを無効にする方法
モダンな代替手段(javascript:void(0) は非推奨)
現在のWeb開発では、javascript:void(0) は非推奨とされています。より適切な代替手段を使いましょう。
❌ 非推奨 → ✅ 推奨パターン
<!-- ❌ 非推奨: javascript:void(0) -->
<a href="javascript:void(0);" onclick="doSomething()">クリック</a>
<!-- ✅ 推奨1: button要素を使う(最もセマンティック) -->
<button type="button" onclick="doSomething()">クリック</button>
<!-- ✅ 推奨2: event.preventDefault() -->
<a href="#" onclick="doSomething(); return false;">クリック</a>
<!-- ✅ 推奨3: addEventListener + preventDefault -->
<a href="#" id="myLink">クリック</a>
<script>
document.getElementById('myLink').addEventListener('click', function(e) {
e.preventDefault(); // ページ遷移を防止
doSomething();
});
</script>
| 方法 |
推奨度 |
メリット |
デメリット |
<button> |
✅ 最も推奨 |
セマンティック・アクセシビリティ良好 |
リンクの見た目にCSSが必要 |
addEventListener + preventDefault |
✅ 推奨 |
HTML/JS分離・複数ハンドラ可 |
コード量が増える |
href="#" + return false |
△ 許容 |
簡潔・広く使われている |
ページ上部にスクロールする場合がある |
javascript:void(0) |
❌ 非推奨 |
確実にページ遷移を防ぐ |
CSP違反・アクセシビリティ問題 |
❌ javascript: が非推奨な理由:
- CSP(Content Security Policy)で
unsafe-inline が禁止されると動かない
- アクセシビリティ:スクリーンリーダーがリンク先を正しく認識できない
- HTML/JS分離の原則に反する
- 右クリック→新しいタブで開くと空白ページになる
アクセシビリティへの影響
javascript:void(0) を使ったリンクは、アクセシビリティの面でも問題があります。
| 観点 |
javascript:void(0) |
<button> |
| スクリーンリーダー |
「リンク」と読み上げるが遷移先が不明 |
「ボタン」と読み上げ、動作が明確 |
| キーボード操作 |
Enter / Spaceで動作(ブラウザ依存) |
Enter / Space 両方で確実に動作 |
| 右クリック→新しいタブ |
空白ページが開く |
右クリックメニューにリンク項目なし |
| JS無効時 |
何も起きない(機能不全) |
submit型ならフォーム送信可能 |
JavaScript 無効時の各手法の動作
| 手法 |
JS有効時 |
JS無効時 |
javascript:void(0) |
ページ遷移なし |
何も起きない(壊れる) |
href="#" |
preventDefault()で制御 |
ページ上部にスクロール |
href="/fallback" |
preventDefault()で制御 |
フォールバックURLに遷移(最も安全) |
<button> |
イベントハンドラ実行 |
form内ならsubmit動作 |
⚠ SEOへの影響:検索エンジンのクローラーは javascript: プロトコルのリンクを辿れません。href="javascript:void(0)" で設定したリンクは、ページ間のリンクジュース(PageRank)を渡さないため、内部リンク構造にも悪影響があります。実際のURLに遷移する機能がある場合は、必ず実URLを href に設定しましょう。
void を使ったIIFE(即時実行関数)
void演算子を使うと、関数宣言を式として扱えるため、IIFE(Immediately Invoked Function Expression)を簡潔に書けます。
IIFEの書き方比較
// 通常のIIFE(括弧で囲む)
(function() {
console.log('即時実行!');
})();
// void を使ったIIFE
void function() {
console.log('即時実行!');
}();
// async 版(トップレベル await が使えない場合)
void async function() {
const data = await fetch('/api/data');
console.log(data);
}();
? なぜ void が必要か:function キーワードが文の先頭にあると「関数宣言」として解釈されます。void を前に付けることで「式」として解釈させ、直後の () で即時実行できるようになります。同じ理由で ! や + を使うパターンもあります。
IIFEの他の書き方(比較)
// どれも同じく即時実行される
(function() { })(); // 最も一般的
(function() { }()); // Crockford推奨スタイル
void function() { }(); // void で式にする
!function() { }(); // ! で式にする
+function() { }(); // + で式にする
// void版は戻り値が常にundefined(明示的に「戻り値を使わない」意図を示す)
const a = (function() { return 42; })(); // 42
const b = void function() { return 42; }(); // undefined
アロー関数の戻り値を無視する void
アロー関数は式を1つだけ書くと自動的にその値を返します。副作用のためだけに実行し、戻り値を無視したい場合に void が役立ちます。
アロー関数 + void
// ❌ 問題: 副作用の関数が値を返してしまう
const handleClick = () => setState(true);
// setState() の戻り値が意図せず返される
// ✅ void で戻り値を明示的に捨てる
const handleClick = () => void setState(true);
// 常に undefined を返す
// 実用例: Promiseの戻り値を無視
const logEvent = (event) => void analytics.track(event);
// analytics.track() はPromiseを返すが、awaitしない
// void で「意図的にPromiseを無視している」ことを明示
// Array.forEach のコールバックなど
items.forEach(item => void processItem(item));
? React での活用:イベントハンドラをアロー関数の省略構文で書くとき、void を使うとハンドラの戻り値がReactに影響しないことを保証できます。ただし、通常はブロック構文 () => { setState(true); } の方が読みやすいとされます。
async 関数の fire-and-forget パターン
async関数はPromiseを返しますが、結果を待たずに実行だけしたい(fire-and-forget)場合に void が特に有用です。
void で Promiseを意図的に無視する
// ❌ ESLint @typescript-eslint/no-floating-promises で警告
fetchUserData(); // Promise が浮いている(awaitもcatchもない)
// ✅ void で「意図的にPromiseを無視している」ことを明示
void fetchUserData(); // ESLint 警告なし
// 実用例: ログ送信(失敗しても問題ない処理)
function handleClick() {
void analytics.track('button_click'); // 送信を待たない
showModal(); // すぐにUIを更新
}
// 実用例: useEffect 内の async 処理(React)
useEffect(() => {
void loadInitialData();
}, []);
? ESLint連携:@typescript-eslint/no-floating-promises ルールは「await も catch もしていない Promise」を警告します。void を付けることで「意図的に無視している」と明示でき、警告が解消されます。これがモダンな開発でvoidが最も有用なパターンです。
TypeScript の void 型
TypeScriptでは void は型としても使われます。JavaScript の void演算子とは別の概念です。
TypeScript の void 型
// 戻り値なしの関数を表す型
function greet(name: string): void {
console.log(`Hello, ${name}!`);
// return 文なし、または return; のみ
}
// コールバックの型定義でよく使う
type EventHandler = (event: Event) => void;
// void と undefined の違い
function fn1(): void {} // OK: return不要
function fn2(): undefined {} // エラー: 明示的にreturn undefinedが必要
// void型の変数には undefined のみ代入可能
let v: void = undefined; // OK
let v2: void = null; // エラー(strictNullChecks時)
| 文脈 |
void の意味 |
例 |
| JavaScript 演算子 |
式を評価して undefined を返す |
void 0 |
| TypeScript 型 |
「戻り値がない」ことを表す型 |
function f(): void {} |
ブックマークレットでの void
ブックマークレット(ブックマークに登録するJavaScriptコード)では、void演算子が今でも重要な役割を果たします。
ブックマークレットの例
// ❌ void なし: 最後の式の戻り値でページが書き換わる可能性
javascript:document.title
// → ページが記事タイトルの文字だけのページになる
// ✅ void あり: ページを書き換えずにスクリプトを実行
javascript:void(document.body.style.backgroundColor='#1e1e2e')
// 実用例: ページのタイトルとURLをコピー
javascript:void(navigator.clipboard.writeText(
document.title + ' - ' + location.href
))
ESLint no-void ルールとベストプラクティス
.eslintrc.json での設定
{
"rules": {
// "error": void を完全に禁止
// "off": void を許可
"no-void": ["error", {
"allowAsStatement": true // 文としての void は許可
}]
}
}
// allowAsStatement: true の場合
void someAsyncFunction(); // ✅ OK(文として使用)
const x = void 0; // ❌ NG(式として使用)
ベストプラクティスまとめ
undefined を取得するなら素直に undefined を使う(ES5+は安全)
javascript:void(0) は使わない → <button> か preventDefault()
- IIFEは括弧スタイル
(function(){})(); が最も一般的
- async関数のPromiseを意図的に無視する場合の
void asyncFn() は有用
- ミニファイ後のコードに
void 0 が出ても驚かない
void 演算子の優先順位
void は単項演算子であり、優先順位は比較的高いです。複合的な式で使う場合は括弧を付けましょう。
優先順位の注意点
// void は右辺の最初の式にだけ適用される
void 2 === undefined; // true → (void 2) === undefined
void (2 === undefined); // undefined → void (false) → undefined
// カンマ演算子との組み合わせ
void 0, 1; // 1 → (void 0), 1 → undefined, 1 → カンマ演算子で1
void (0, 1); // undefined → void (0, 1) → void 1 → undefined
void と他の単項演算子の比較
| 演算子 |
動作 |
例 |
結果 |
void |
式を評価し undefined を返す |
void 42 |
undefined |
typeof |
型を文字列で返す |
typeof 42 |
“number” |
delete |
プロパティを削除 |
delete obj.key |
true / false |
! |
論理否定 |
!true |
false |
~ |
ビット否定 |
~5 |
-6 |
+ / - |
数値変換 / 符号反転 |
+"42" |
42 |
? ポイント:void だけが「常に同じ値(undefined)を返す」単項演算子です。他の単項演算子はオペランドに応じて異なる値を返します。この特性があるからこそ、「戻り値を捨てる」「undefinedを確実に取得する」という用途に使えるわけです。
トラブルシューティング
| 症状 |
原因 |
対処法 |
| javascript:void(0) が動かない |
CSPで unsafe-inline が禁止されている |
addEventListener + preventDefault に変更 |
| ESLint で no-void エラー |
void 演算子の使用が禁止されている |
allowAsStatement: true に設定するか、代替手段を使う |
| void function() が SyntaxError |
末尾の () を忘れている |
void function() { }(); と末尾に () を付ける |
| href=”#” でページ上部にスクロール |
# がアンカーとして解釈される |
preventDefault() を使うか、button 要素に変更 |
| ミニファイ後に void 0 が大量に出現 |
ミニファイツールがundefinedをvoid 0に圧縮 |
正常な動作。void 0 === undefined なので問題なし |
まとめ
| 用途 |
コード |
現在の推奨度 |
| undefinedの安全な取得 |
void 0 |
△ ミニファイツール向け |
| リンクの無効化 |
javascript:void(0) |
❌ 非推奨 → button / preventDefault |
| IIFE |
void function(){}() |
△ 括弧スタイルが一般的 |
| Promiseの意図的な無視 |
void asyncFn() |
✅ 有用 |
| アロー関数の戻り値破棄 |
() => void expr |
○ 場面による |
| ブックマークレット |
javascript:void(...) |
✅ 今でも必要 |
void演算子は「常にundefinedを返す」というシンプルな機能ですが、JavaScript の歴史的な事情やブラウザの挙動と深く結びついています。モダンな開発では javascript:void(0) に代わる手段を使いつつ、ミニファイ後のコードやブックマークレットで見かけた際に理解できるようにしておきましょう。
関連記事:undefinedの意味と使い方 / JavaScript演算子の使い方と例まとめ / aタグのリンクを無効にする方法 / 三項演算子の使い方