【JavaScript】void演算子の使い方|void 0・javascript:void(0)・IIFE・モダンな代替手段まで完全解説

【JavaScript】void演算子の使い方|void 0・javascript:void(0)・IIFE・モダンな代替手段まで完全解説 JavaScript

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タグのリンクを無効にする方法三項演算子の使い方