JS.next

JavaScriptの最新実装情報を追うブログ

正規表現系のシンボルが実装された

概要

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(デフォルト有効)