🤷
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