2015年11月25日

RegExp.$1 と String.prototype.replace の悲惨な関係 (2)

Firefox は String.prototype.replace で関数を実行後に RegExp.$1 などを復元する、と前回の記事に書きましたが、この挙動は bug 1226936 で削除されました。

Firefox 45 からは、Chrome や Safari と同じく関数実行前に値を格納するだけ、となります。

                                    //  Firefox 45 | Chrome | Safari | Edge | IE
/(a)/.exec("a");                    // -----------+--------+--------+------+----
console.log(RegExp.$1);             //      a     |    a   |    a   |   a  |  a
"b".replace(/(b)/, function() {     //            |        |        |      |
  try {                             //            |        |        |      |
    console.log(RegExp.$1);         //      b     |    b   |    b   |   a  |  a
    "c".replace(/(c)/, function() { //            |        |        |      |
      console.log(RegExp.$1);       //      c     |    c   |    c   |   a  |  a
      /(d)/.exec("d");              //            |        |        |      |
      console.log(RegExp.$1);       //      d     |    d   |    d   |   d  |  d
      throw 1;                      //            |        |        |      |
    });                             //            |        |        |      |
  } catch (e) {}                    //            |        |        |      |
  console.log(RegExp.$1);           //      d     |    d   |    d   |   d  |  d
});                                 //            |        |        |      |
console.log(RegExp.$1);             //      d     |    d   |    d   |   b  |  b

ES6 対応もやりやすくなり、ブラウザ間の差異も軽減されていい事づくめですね。めでたしめでたし。

0 件のコメント:

コメントを投稿