正規表現リテラルのes3からes5の間での変化
何度目かの聖書(JavaScript: The Good Parts)の輪読会をしてたときに、RegExpの章を担当してくれた子が、「正規表現リテラルから生成される正規表現オブジェクトは内容が同じなら参照も同じになります!」って説明してくれて、「あれ、そうだっけ」って思って調べた。
たしかに書いてる
RegExp objects made by regular expression literals share a single instance:function make_a_matcher() { return /a/gi; } var x = make_a_matcher(); var y = make_a_matcher(); // Beware: x and y are the same object! x.lastIndex = 10; document.writeln(y.lastIndex); // 10via JavaScript: The Good Parts
半信半疑で実行するとやっぱりそんなことなかった
ということでどこかで仕様かわったんだろうなーって思ってみてたら3rdから5thの流れの中でそれらしい変更を見つけた
3rd
Regular Expression Literals
A regular expression literal is an input element that is converted to a RegExp object (section 15.10) when it is scanned. The object is created before evaluation of the containing program or function begins. Evaluation of the literal produces a reference to that object; it does not create a new object. Two regular expression literals in a program evaluate to regular expression objects that never compare as === to each other even if the two literals' contents are identical. A RegExp object may also be created at runtime by new RegExp (section 15.10.4) or calling the RegExp constructor as a function (section 15.10.3).
5th
Regular Expression Literals
A regular expression literal is an input element that is converted to a RegExp object (see 15.10) each time the literal is evaluated. Two regular expression literals in a program evaluate to regular expression objects that never compare as === to each other even if the two literals' contents are identical. A RegExp object may also be created at runtime by new RegExp (see 15.10.4) or calling the RegExp constructor as a function (15.10.3).
- 正規表現リテラルが正規表現オブジェクトに変換されるタイミングが正規表現リテラルが含まれる関数の走査時から正規表現リテラルの評価時にかわった
- 「評価された正規表現リテラルは正規表現オブジェクトの"参照"を生成する(新しく正規表現オブジェクトを生成しない)」の記述がごっそりなくなってる
後者の一文がなくなったってことは都度評価されて都度新しいオブジェクトが返却されてるんでしょうかね(返却される正規表現オブジェクト自体は内容が同じでも別物になるって次の文にかいてある)
どこかで、ES3の時代だと正規表現オブジェクト作るコストが大きかったので参照する仕様になってて、ES5の時代はそんなに気になるコストじゃなくなったから毎回作るようになったとか見た気がする "正規表現リテラルのes3からes5の間…" http://t.co/ESxFACa2A8
— azu (@azu_re) 2014, 3月 12
なるほどー。