【実務・中級編】 RegExpオブジェクトの型判定 – JavaScript実践ガイド

正規表現の型判定に「typeof」を使うな。現場で恥をかかないためのJS型判定の作法

フロントエンドのコードベースが巨大化してくると、APIから流れてくるデータや、ユーザー入力のバリデーション、あるいは汎用的なユーティリティ関数の作成において「今、手元にあるこの変数は正規表現(RegExp)なのか?」を判定したい場面に必ず出くわします。

中級エンジニアがここで陥りやすい罠が、安易に `typeof` を使ってしまうことです。今日は、なぜそれが危険なのか、そして我々プロが現場でどう書いているのか、その「正解」を叩き込みます。

—

なぜ `typeof` は役立たずなのか

まず、基本のおさらいです。JavaScriptにおいて `typeof` は、プリミティブ型を判定するのには優秀ですが、オブジェクト系に対しては絶望的に無力です。

const regex = /abc/g;

console.log(typeof regex); // “object”

見ての通り、`typeof` では `RegExp` も `Array` も `null` も、単なる `”object”` としか返ってきません。これでは「正規表現か?」という問いに対して、あまりに解像度が低すぎます。

「じゃあ、`instanceof` を使えばいいじゃないか」と思うでしょう? 確かに、単一のウィンドウやコンテキスト内であれば `regex instanceof RegExp` で事足ります。しかし、我々が戦っているのはそんなに単純な環境ではないはずです。

`instanceof` が抱える「死角」

`instanceof` は、プロトタイプチェーンを辿って判定します。しかし、Webアプリケーションにおいて、iframeをまたいでデータを受け取ったり、異なる実行環境(VM)でオブジェクトが生成された場合、`instanceof` は平気で `false` を返します。

「なぜか正規表現なのにバリデーションを通過しない……」

デバッグでこの沼にハマったことはありませんか? それは、あなたのコードが「見た目は正規表現だが、異なる実行コンテキストのプロトタイプを継承しているオブジェクト」を正しく扱えていないからです。

—

実務での「唯一無二」の正解:Object.prototype.toString

現場の泥臭い環境下でも確実に動作する、最も堅牢な判定手法は `Object.prototype.toString.call()` を使う方法です。これは、各オブジェクトが内部的に持つ `[[Class]]` プロパティを直接覗きに行くという、JavaScriptの裏側を突くテクニックです。

コピペして使える実用コード

/

  • 対象が真のRegExpオブジェクトかどうかを判定する
  • 異なるiframe間や複雑な環境でも動作する堅牢な判定関数

/
function isRegExp(value) {
// Object.prototype.toString を実行すると “[object RegExp]” という文字列が返ってくる
// これをチェックするのが最も安全で、世界中のライブラリで採用されている手法です
return Object.prototype.toString.call(value) === ‘[object RegExp]’;
}

// 動作確認
console.log(isRegExp(/abc/)); // true
console.log(isRegExp(new RegExp(‘a’))); // true
console.log(isRegExp({})); // false
console.log(isRegExp(“abc”)); // false

なぜこれがベストなのか?

1. 環境依存がない: `window` オブジェクトが異なろうが、生成元が別であろうが、内部的な `[[Class]]` を参照するため、常に一貫した結果を返します。
2. 高速: `try-catch` でエラーを拾うような邪道なハックに比べ、エンジン側での最適化が効きやすく、パフォーマンス上のオーバーヘッドも極めて低いです。
3. 可読性: 熟練のエンジニアなら、`Object.prototype.toString` の記述を見ただけで「ああ、型判定をしっかりやっているな」と一目で信頼を置けます。

—

最後に:プロとしての心構え

JavaScriptは自由な言語です。だからこそ、型判定のような基本中の基本において「動けばいいや」という妥協をしてしまうと、後々、原因不明のバグという名の「負債」となって自分たちに跳ね返ってきます。

今日紹介した `Object.prototype.toString` を使った判定は、lodashのような著名なライブラリでも採用されている手法であり、いわば「業界標準の作法」です。

皆さんのチームのプロジェクトでも、もし `typeof` や `instanceof` で適当に型判定している箇所を見つけたら、ぜひこの手法にリファクタリングしてみてください。小さなことですが、そうした細部へのこだわりこそが、あなたのコードを「動くもの」から「信頼できる資産」へと変えていくのです。

現場からは以上です。次の現場でも、堅牢なコードを書いていきましょう。

コメント

タイトルとURLをコピーしました