🤷

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 を読んでください。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/search

とにかく、この String.prototype.search 関数は整数を返す。基本的には。

整数を返さないケース

Symbol.searchexec がおかしいオブジェクトを引数に渡すと、整数を返させないことができる。以下のコードは 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