JavaScript規格の正規表現リテラルの文面の疑問点
JavaScript規格、ECMA-262 Edition 5.1を読み進めていて、以下の文面が気になった。
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.
正規表現リテラルは、リテラルが評価されるごとに、RegExpオブジェクトに変換される入力要素である。プログラム中の二つの正規表現リテラルは、たとえ二つのリテラルの中身が同一であっても、===と比較されることのない正規表現をオブジェクトに評価される。
§7.8.5 Regular Expression Literals
つまりは、/./ === /./ はfalseになるということだ。しかし、二つの正規表現リテラルという文面は気になる。以下の場合はどうか。
for ( var elem in [ true, false ] )
{
var r = /./ ; // ひとつの正規表現リテラル
if ( elem )
var a = r ;
else
var b = r ;
}
a === b ; // ?
これはどうなるのだろう。プログラム中に、正規表現リテラルはひとつしかない。ひとつの正規表現リテラルが二回評価されるだけだ。やや屁理屈かもしれぬが、どうもこの文面はおかしくないだろうか。
ドワンゴ広告
この記事はドワンゴ勤務中にやんごとなき理由により自分の机を離れて書いた。
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0