
JavaScript void(0)とは?意味・エラー修正・代替方法をTypeScriptとundefinedの違いも解説
リンクをクリックしたのにページが変わらない——そんな経験、一度はあるでしょう。javascript:void(0) がMDN Web Docs(Web 標準リファレンス)で定義された仕組みの上に、今も多数のWebサイトで使われています。この記事では、その正体・エラー修正・代替手段・TypeScript での扱いまで、実務に即して整理します。
void 0 の返り値: undefined(厳密には undefined 型の値) ·
主な使用箇所: href 属性内の javascript: 疑似プロトコル ·
代替手段: event.preventDefault() または href=’#’
クイックスナップショット
- void 演算子は式を評価し undefined を返す(MDN Web Docs(Web 標準リファレンス))
- void 0 === undefined は true(MDN Web Docs(Web 標準リファレンス))
- Chrome での修正手順:イベントリスナーで処理(MDN Web Docs(Web 標準リファレンス))
- Vault での回避方法:onclick と return false の併用(Stack Overflow(開発者コミュニティ))
- event.preventDefault() を使う(MDN Web Docs(Web 標準リファレンス))
- href=’#’ と onclick ハンドラの組み合わせ(侍エンジニアブログ(エンジニア向け解説メディア))
- () => void の型指定は戻り値を void に制約(TypeScript 公式ハンドブック(言語仕様ドキュメント))
- void 型には undefined のみ代入可能 (TypeScript 公式ハンドブック(言語仕様ドキュメント))
5つのキーファクト、1つのパターン:void 演算子の本質は「式を評価して必ず undefined を返す」という単純な動作に集約されます。
| 項目 | 値 |
|---|---|
| 演算子の種類 | 単項演算子 |
| 返り値 | undefined |
| 主な使用例 | href=”javascript:void(0)” |
| モダンな代替 | event.preventDefault() |
| TypeScript での型 | void は undefined のみ代入可能 |
パターン: void 演算子の本質は副作用を起こさずに undefined を生成する一点にあり、javascript: URI での利用はその副産物に過ぎない。
void 0 とはどういう意味ですか?
void 演算子の基本
- void 演算子は、与えられた式を評価して MDN Web Docs(Web 標準リファレンス)が明示的に定義する通り、必ず undefined を返す単項演算子です。
- 例えば
void(0)もvoid 1も結果は同じ undefined であり、スプレッドワン(日本企業の技術ブログ)もvoid()やvoid('hello')がすべて undefined を返すと解説しています。
初心者が void(0) を「リンク無効化の呪文」と覚えてしまうと、後々 event.preventDefault() や TypeScript の型システムと向き合う際に混乱する。void はあくまで「undefined を生成する式」であり、javascript: URI はその1つの応用に過ぎない。
void 0 が undefined を返す仕組み
void 0の返り値は undefined であり、MDN Web Docs(Web 標準リファレンス)によればこの文字列はグローバル変数undefinedと完全に等価(=== で true)です。- 古いコードで
void 0が好まれた理由の1つは、undefinedが変数として上書き可能だった時代に、確実にプリミティブ値 undefined を得るためでした。現在はundefinedの書き換えは不可ですが、Qiita(日本語エンジニアコミュニティ)の解説にもある通り「真のundefined」を得る手法として根強い支持があります。
モダンなコードベースでは undefined を直接使えば十分。ただしレガシー環境や strict モード以前の互換性を考慮するなら、void 0 は今なお有効な選択肢である。
JavaScript void 0 エラーの修正方法は?
Google Chrome での対処法
javascript:void(0)が原因でリンクが機能しない場合、MDN Web Docs(Web 標準リファレンス)が推奨するのはイベントリスナー(addEventListener)を使ってページ遷移を防ぐ方法です。- 具体的には
<a href="#" onclick="event.preventDefault(); myFunction();">と書けば、javascript: URI に頼らず目的の動作を実現できます。
Vault エラーの回避策
- 一部の Vault(パスワード管理ツールなど)は
javascript:void(0)を誤検知しエラーを表示することがあります。Stack Overflow(開発者コミュニティ)での一般的な対処は、リンク先をhref="javascript:void(0)"からhref="#"に変更し、onclick でreturn false;を追加する方法です。
その他のブラウザでの対応
- MDN Web Docs(Web 標準リファレンス)の警告にもある通り、javascript: URI はブラウザによって動作にバラつきがあり、特にモバイルブラウザで意図しないページ遷移が起きることがあります。統一的な解決策は
event.preventDefault()に統一することです。
javascript: URI をリンクに使うと、アクセシビリティ上の問題も生じる。スクリーンリーダーは javascript:void(0) を無意味なリンクと解釈し、キーボード操作でフォーカスが移っても何も起きないとユーザーを混乱させる。
JavaScript void 0 は悪いのですか?
void(0) が非推奨と言われる理由
- MDN Web Docs(Web 標準リファレンス)は、javascript: URI の仕様として「返値が undefined でない限りページ内容が置き換えられる」と警告しています。
void(0)自体は正しく undefined を返しますが、誤って別の式を渡すとページ全体がその式の結果で上書きされる危険があります。 - また侍エンジニアブログ(エンジニア向け解説メディア)が指摘する通り、モダンなフレームワーク(React, Vue など)では仮想 DOM のイベントシステムが
preventDefaultを前提としており、javascript: URI はそもそも想定外のパターンです。
いつ使っても良いか
- 絶対に使ってはいけないわけではありません。例えば、古い CMS やレガシーシステムで JavaScript のイベントハンドラを追加できない制約下では、
href="javascript:void(0)"が唯一の選択肢になることもあります。 - ただし、スプレッドワン(日本企業の技術ブログ)が注意するように、アロー関数の IIFE には void を適用できないため、最新のコードに混在させると予期せぬ動作を引き起こす可能性があります。
新規開発:使うべきでない。既存コードのリファクタリング:優先度は低いが、触る機会があれば event.preventDefault() に置き換える。レガシー保守:残す判断も合理的选择。
() => void と TypeScript の void の違いは?
() => void の意味
() => voidは、引数を取らず戻り値が void 型である関数の型注釈です。TypeScript 公式ハンドブック(言語仕様ドキュメント)は、void 型の戻り値を持つ関数は undefined を返すことを想定しています。- 実際には
() => void型の関数はundefinedを返す関数だけでなく、return null;やreturn 42;を書いてもエラーにならない——というのが TypeScript の「構造的部分型」の特徴です。これは void 型が「戻り値を使わない」という契約であるためです。
TypeScript における void 型の使い方
- TypeScript の void 型の変数には TypeScript 公式ハンドブック(言語仕様ドキュメント)の定義通り、undefined のみ代入可能です。一方、
nullはstrictNullChecksが有効な場合は代入できません。 - 実務では、コールバック関数の型として
() => voidを指定し、戻り値を無視する設計がよく使われます。例えばArray.prototype.forEachのコールバックも内部的には戻り値を void として扱います。
JavaScript の void 演算子は「値を undefined に変換する」。TypeScript の void 型は「戻り値を使わない契約をコンパイラに伝える」。目的は真逆だが、どちらも「何かを無効にする」という精神は共通している。
void 0 と undefined の違いは?
厳密な等価性
void 0とundefinedは MDN Web Docs(Web 標準リファレンス)の説明通り、厳密等価演算子(===)で比較すると true になります。すなわち型も値も完全に同一です。- スプレッドワン(日本企業の技術ブログ)は
void(1)もvoid('hello')も同じ undefined を返すことを確認しており、つまり void に与える値は結果に影響しません。
使用上の注意点
- 歴史的な理由で
void 0が好まれたのは、undefinedが変数として書き換え可能だった ES3 時代の遺産です。現在の ECMAScript 5+ ではundefinedの書き換えは無視されますが、Qiita(日本語エンジニアコミュニティ)の記事にもあるように、コードレビューで「undefined が安全かどうか」の議論を避けたいチームでは今でもvoid 0が使われます。 - 可読性の観点では
undefinedの方が直感的です。void 0は「なぜ0なのか」と不必要な疑問を呼びます。
新規コード:undefined を直接使う。レガシー互換が必要なコード:void 0。TypeScript 環境では厳密に undefined 型を扱えるので、void 演算子で undefined を得る必要はまずない。
確定している事実
- void 演算子は式を評価し undefined を返す(MDN Web Docs)
- void 0 === undefined は true(ECMAScript 仕様)
- javascript:void(0) はページ遷移を防ぐために使われる(Stack Overflow)
不明な点
- void 0 が完全に非推奨かどうかは状況による(アクセシビリティ要件など)
- 一部の古いブラウザでの互換性リスク(ただし現在はほぼ問題なし)
MDN Web Docs(Web 標準リファレンス)は void 演算子を「与えられた式を評価して undefined を返す」と定義している。この単純な仕様が、javascript: URI から TypeScript の型システムまで、広範な影響を持っている。
MDN Web Docs の公式解説
Stack Overflow(開発者コミュニティ)のトップ回答では、
javascript:void(0)は「何もしないリンクを作るためのハック」であり、モダンな開発ではevent.preventDefault()が推奨されると説明されている。Stack Overflow コミュニティの合意
よくある質問
void 0 と null の違いは?
void 0 は undefined を返します。null は「値が存在しない」ことを示すプリミティブ値で、型も異なります(typeof null は “object”)。厳密等価演算子で比較すると false になります。
javascript:void(0) がクリックしても反応しない場合の対処法は?
ブラウザの拡張機能やセキュリティ設定が javascript: URI をブロックしている可能性があります。代わりに href="#" と event.preventDefault() の組み合わせに変更することを推奨します。
void 演算子を使う際の注意点はありますか?
アロー関数の IIFE には void を適用できません。また、javascript: URI 内で void 以外の式を渡すとページ内容が置き換わるリスクがあるため、常に void(0) または void 0 を使うべきです。
void(0) を window.open と組み合わせて使えますか?
技術的には可能です。例えば href="javascript:void(window.open('https://example.com'))" のように書けますが、アクセシビリティとブラウザ互換性の観点から、 onclick ハンドラで window.open() を呼び return false; する方法が推奨されます。
void(0) は SEO に影響しますか?
直接的には影響しません。ただし、javascript:void(0) を使ったリンクはクローラーが適切にフォローできない場合があるため、重要なリンクには使わない方が無難です。Google も JavaScript をレンダリングしますが、信頼性の高いナビゲーションは通常の URL で提供すべきです。
void(0) と return false の違いは?
イベントハンドラ内で return false; は event.preventDefault() と event.stopPropagation() の両方を実行します。 void(0) は単に undefined を返すだけなので、ページ遷移を防ぐためには javascript: URI のコンテキストが必要です。
void(0) はモダンな JavaScript でまだ使われていますか?
新規コードではほとんど使われていません。しかし、レガシーシステムの保守や、特定の CMS(特に管理画面のリンク)では今も見られます。TypeScript や React のコードベースではまず見かけません。
JavaScript の void 演算子は、ECMAScript 仕様の一機能として正当な位置を持ちながら、実務では「時代遅れのハック」と「確実な undefined 生成手段」の二面性を持つ。新規開発の現場では event.preventDefault() が標準だが、レガシーコードを抱えるシステムにとっては、void 0 を完全に追放することより、その動作を理解した上で必要に応じて置き換える判断が現実的だ。
Related reading: OK Google、デバイスのセットアップリストが出ない原因と対処法 · Windows 10 ESU Microsoft ストア