正規表現系のシンボルが実装された
概要
ES2015以前は正規表現オブジェクトを引数で取る関数は一般に、内部で引数が正規表現オブジェクトであるかどうかの判定をして、独自の処理をしていたが、
ES2015からは代わりに各処理に合うシンボルプロパティを持っているかどうかの判定をし、そのシンボルメソッドへ処理を委譲するようになった。
導入されるビルトインシンボルとそれを利用するビルトインメソッド一覧
@@match [4.9.62]
Srting.prototype.match
string.match( regexp )
→ regexp[ @@match ]( string )
@@replace [4.10.9]
String.prototype.replace
string.replace( searchValue, replaceValue )
→ searchValue[ @@replace ]( string, replaceValue )
@@search [4.9.212]
Srting.prototype.search
string.match( regexp )
→ regexp[ @@search ]( string )
@@split [4.8.267]
String.prototype.split
string.split( separator, limit )
→ separator[ @@split ]( string, limit )
※これらに対応するシンボルメソッドはRegExp.prototype下にも定義される。
利用例
使う側が意識しなくて良い、ビルトインRegExpオブジェクトに依存しないものを定義することができる。
例:区切りで分けるセパレータ
class PuncSeparator { constructor( separators = [...'\n\r ,.、。'] ) { this.separators = separators } [Symbol.split](str, lim) { let ary = [], buf = '', sep = this.separators if (lim > 0) for (let char of str) { if (!sep.includes(char)) buf += char else if (buf) { ary.push(buf) buf = '' if (ary.length >= lim) break } } if (buf) ary.push(buf) return ary } } let ps = new PuncSeparator console.log( '私は、今日も、元気です。'.split(ps) ) // ["私は", "今日も", "元気です"]
実装されるバージョン
V8 4.8.267 - 4.10.125(デフォルト有効)