リンクをクリックしたのにページが変わらない——そんな経験、一度はあるでしょう。javascript:void(0)MDN Web Docs(Web 標準リファレンス)で定義された仕組みの上に、今も多数のWebサイトで使われています。この記事では、その正体・エラー修正・代替手段・TypeScript での扱いまで、実務に即して整理します。

void 0 の返り値: undefined(厳密には undefined 型の値) ·
主な使用箇所: href 属性内の javascript: 疑似プロトコル ·
代替手段: event.preventDefault() または href=’#’

クイックスナップショット

1void 0 の基本
2エラー解決
3代替手段
4TypeScript の void

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 のみ代入可能です。一方、nullstrictNullChecks が有効な場合は代入できません。
  • 実務では、コールバック関数の型として () => void を指定し、戻り値を無視する設計がよく使われます。例えば Array.prototype.forEach のコールバックも内部的には戻り値を void として扱います。
実務での違い

JavaScript の void 演算子は「値を undefined に変換する」。TypeScript の void 型は「戻り値を使わない契約をコンパイラに伝える」。目的は真逆だが、どちらも「何かを無効にする」という精神は共通している。

void 0 と undefined の違いは?

厳密な等価性

  • void 0undefined は 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 を完全に追放することより、その動作を理解した上で必要に応じて置き換える判断が現実的だ。