本の虫

著者:江添亮
ブログ: 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では、多くの文は、セミコロンという終端記号を明示的に記述して、文の終わりを示す。

var i = 0 ;
++i ;
--i ;

しかし、JavaScriptでは、一部の文脈で、セミコロンの省略が許されている。あたかも、セミコロンが自動的に挿入されたかのように振る舞う。これを、自動セミコロン挿入(Automatic Semicolon Insertion)

ECMA-262 Edition 5.1 §7.9が規定する、自動セミコロン挿入の定義を、本記事では解説する。

まず、三つの基本的なルールがある。

最後のルールは、たとえば以下のようになる。

var i = 0 ;

i // 自動セミコロン挿入
++ ; // 文法エラー
i // 自動セミコロン挿入
-- ; // 文法エラー

function f()
{
    return // 自動セミコロン挿入、undefinedが返される。
    {
    // JSON的な何か
    } ;
}

ただし、自動挿入したセミコロンが空文に解釈される場合と、for文のヘッダーの中では、自動セミコロン挿入は行われない。

// 空文に解釈される場合
if( cond )
else

これは、もし自動セミコロン挿入が行われるとするならば、以下のようになる。

// 空文に解釈される場合
if( cond ) ;
else ;

このセミコロン挿入は、どちらも空文となるので、自動セミコロン挿入は行われない。

for文のヘッダーとは、for ( ... ; ... ; ... )のことだ。これにも自動セミコロン挿入は行われない。

さて、なぜ自動セミコロン挿入などという規則が存在するのか。思うに、ECMAScriptというのは、規格があって、しかる後にJavaScriptとして実装された言語でではない。JavaScriptという実装だけが先行して、あとからデファクトスタンダードとなった挙動を、ECMAScriptとして追認した形なのだ。規格の責任ではない。無秩序に進化した実装の歴史的経緯の問題である。したがって、既存の実装の挙動を、なるべく正確に規格に落としこんでいる。ECMA-262 Edition 5.1は、既存の実装の挙動を規格に落としこむという点で、非常にいい仕事をしたと思う。文面は読みやすい。JavaScriptは、C++より落とし穴が多い言語であるが、ECMA-262 Edition 5.1で、だいぶ救われている。

なお、規格では、自動セミコロン挿入には頼るべきではなく、明示的にセミコロンを書くべきだとしている。

ドワンゴ広告

この記事は、ドワンゴで最も怠惰な社員である筆者が、出社早々To Court The Kingで遊んだあとに、超チューニング祭に向けて準備をするふりをして書いた。まだバレていないようだ。

そういえば、昨日、珍しく時間の指定されて参加する必要のある社内会議があったので、予定時間の5分前に会議室に行った所、まだ誰も集まっていないどころか、会議室が別の会議で使用中であった。仕方がないので、一旦引き上げて、予定時間の2分後に会議室に行った所、前の会議の参加者は引き上げた上に、すでに全員集まって着席していた。一体、わずか7分間の間に何があったのか。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0