2016年3月16日

RegExp.multiline スイッチが消えます

この記事は全体として、まもなく消えるスーパー非推奨な機能の挙動について扱っています。コードを書く時の参考にしたりしないでください。

SpiderMonkey に JavaScript 1.2 の頃からある機能に RegExp.multilineRegExp['$*'] っていうのがあります。 これはどちらも同じもので、ES6 でいうところの m フラグ相当のもの (^$ を行頭と行末にマッチさせるかどうか) を、 グローバルな状態として切り替え可能にしておこう、っていう機能です。

2016-03-16 の時点での挙動としては、新規の生成する RegExp オブジェクトの m フラグに反映されるようになってます。

# 初期状態は false です

js> RegExp.multiline
false
js> RegExp['$*']
false
js> /a/
/a/

# true にするとこれから作成する RegExp インスタンスに m フラグが付きます

js> RegExp.multiline = true
true
js> RegExp['$*']
true
js> /a/
/a/m

# RegExp コンストラクタも同様です

js> new RegExp("a")
/a/m

# false に戻すと m フラグは付かなくなります

js> RegExp.multiline = false
false
js> /a/
/a/

# 先に定義しておいた関数内にも効きます

js> function f() { return /a/; }
js> f()
/a/
js> RegExp.multiline = true
true
js> f()
/a/m

そんな RegExp.multiline ですが、現在では非標準な上に内部での扱いがとてつもなくめんどくさいので、bug 1219757 で削除されます。おそらく Firefox 48 のうちに FIXED になるでしょう。

一方 m フラグは、少し遅れて JavaScript 1.5 で追加され、標準化されました。なので、もし bug 1219757 が FIXED になった後でアドオンなんかが動かなくなった、という場合には RegExp.multilineRegExp['$*'] を使用しているコードを探し出して、m フラグを使うように書きかえてください。

0 件のコメント:

コメントを投稿