本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合の宛先:
郵便番号:165-0027
住所:東京都中野区野方5-30-13 ヴィラアテネ401
宛名:江添亮

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