🤷
String.prototype.search に整数を返させない
背景
JavaScript には String.prototype.search
という関数がある。この関数は、文字列の中から正規表現パターンに最初に一致したインデックスを返す。
const str = "foo bar";
const re = /bar/;
console.log(str.search(re)); // 4
もし一致するパターンが見つからなければ -1 を返す。
const str = "foo bar";
const re = /baz/;
console.log(str.search(re)); // -1
詳細は MDN を読んでください。
とにかく、この String.prototype.search
関数は整数を返す。基本的には。
整数を返さないケース
Symbol.search
や exec
がおかしいオブジェクトを引数に渡すと、整数を返させないことができる。以下のコードは RegExp.prototype[Symbol.search]
は呼び出されているが、String.prototype.search
は整数を返さない例として作成した。そもそも Symbol.search
が変な値を返すように変更しても整数を返させないことはできる。
const fakeRegExp = {
[Symbol.search]() {
return RegExp.prototype[Symbol.search].call(this);
},
exec() {
return { index: "私は整数ではありません" }
}
};
console.log("foo".search(fakeRegExp)); // "私は整数ではありません"
実用的には全く役に立たないのだが、処理系側で String.prototype.search
を最適化しようとすると、このことを考慮しないといけない。
JavaScript〜〜〜って感じ。
Discussion