このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

Symbol.match

Baseline 広く利用可能

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2020年1月以降、すべてのブラウザーで利用可能です。

Symbol.match は静的データプロパティで、ウェルノウンシンボルSymbol.match を表します。String.prototype.match() メソッドは第 1 引数に対して、入力文字列と現在のオブジェクトとの照合に使われるメソッドを、このシンボルで探します。このシンボルは、オブジェクトが正規表現として扱われるべきかどうかを決定するためにも使用されます。

詳しくは、RegExp.prototype[Symbol.match]() および String.prototype.match() を参照してください。

試してみましょう

const regexp = /foo/;
// console.log('/foo/'.startsWith(regexp));
// 予想される結果 (Chrome): Error: First argument to String.prototype.startsWith must not be a regular expression
// 予想される結果 (Firefox): Error: Invalid type: first can't be a Regular Expression
// 予想される結果 (Safari): Error: Argument to String.prototype.startsWith cannot be a RegExp

regexp[Symbol.match] = false;

console.log("/foo/".startsWith(regexp));
// 予想される結果: true

console.log("/baz/".endsWith(regexp1));
// 予想される結果: false

ウェルノウンシンボル Symbol.match です。

Symbol.match のプロパティ属性
書込可能不可
列挙可能不可
設定可能不可

解説

この関数は、オブジェクトが正規表現の動作をするかどうかを識別するためにも使用されます。たとえば、String.prototype.startsWith(), String.prototype.endsWith(), String.prototype.includes() メソッドは、最初の引数が正規表現であるかどうかを確認し、正規表現である場合は TypeError が発生します。ここで、match シンボルが false(または偽値、ただし undefined でないもの)に設定されている場合、そのオブジェクトが正規表現オブジェクトとして使用されることを意図していないことを示します。

isRegExp チェックを無効にする

以下のコードは TypeError を投げます。

js
"/bar/".startsWith(/bar/);

// TypeError が発生。/bar/ が正規表現であり、
// Symbol.match が変更されていないため。

ただし、Symbol.matchfalse に設定すると、オブジェクトが正規表現オブジェクトではないことを示します。結果として、startsWithendsWith メソッドは、TypeError を発生させません。

js
const re = /foo/;
re[Symbol.match] = false;
"/foo/".startsWith(re); // true
"/baz/".endsWith(re); // false

仕様書

仕様書
ECMAScript® 2027 Language Specification
# sec-symbol.match

ブラウザーの互換性

関連情報