再入門JavaScript: 字句構造, リテラル

(2002.1.3) 新規作成.
(2007.1.27) 加筆し、ページを独立。
(2017.7.23) 全体的に、現代的な内容にupdate.

JavaScript / ECMAScriptのオブジェクトシステム、言語仕様など。すでに何らかのプログラミング言語が分かっている人が、手早くJavaScriptを理解するための手引きとして。

ECMAScript 5は、ほとんどのWebブラウザ、サーバで、ほぼ完全に実装されている。今回は、ECMAScript 5 をベースに解説を更新した。

字句構造

JavaScriptのスクリプトの文字コードはUnicode (規格ではUTF-16と書いているが、UTF-8でも問題ない。) で書くことになっている。が、HTMLに埋め込むなら地のHTMLと同じ文字コードにするしかない。

コメント

コメントは次の2種類。

  1. 複数行コメント. 「/*」から「*/」まで。入れ子にはできない。
  2. 単一行コメント. 「//」から行末まで. 文法が正規表現リテラルと曖昧だが、どちらとも解釈できる場合は, 単一行コメントが優先される。正規表現にするときは適宜エスケープが必要。

セミコロンの自動挿入

JavaScriptの文は「;」(セミコロン)で区切る。正しくは, 文はセミコロンで終わる (文の一部)。

しかし、セミコロンが必要な箇所に存在しなくても, エラーにならない場合がある。JavaScript のおせっかい機能で、行末にセミコロンがないときは、文脈から次の行に続いていることが明らかな場合を除き、セミコロンが自動的に挿入される (automatic semicolon insertion)。

JavaScript
[RAW]
  1. "use strict";
  2. function x() {
  3. return
  4. 1;
  5. }
  6. document.write( x() ); // => undefined
JavaScript
[RAW]
  1. function x() {
  2. return 1 + // 明らかに継続行
  3. 1;
  4. }
  5. document.write(x()); // 2

上の例のように, returnの直後の改行など、文が継続していると解釈できる場合であっても、自動セミコロン挿入されてしまう。意図していない場合があり、まったくよくない機能。しかし、過去との互換性のため, strictモードでも行われる。

strictモード

strictモードは, JavaScript の悪い慣習を, 意図してエラーにする。新しいコードを書く場合、常に有効にすべき。

スクリプトファイル全体または個別の関数単位で適用できる。フレームワークが出力時にファイルを連結するなどで, non-strict なコードが混ざる場合は関数単位で有効にし、そうでない場合はファイル全体で有効にする。

ファイル全体に適用するには、ファイルの冒頭に、"use strict"; と書く。

JavaScript
[RAW]
  1. "use strict";
  2. // strictモードではエラー
  3. //v = "hi!";
  4. var v = "hi!";

関数単位は、関数の冒頭で同様に書く。

JavaScript
[RAW]
  1. function strict() {
  2. "use strict";
  3. var v = 12;
  4. }
  5. strict();
  6. function nonStrict() {
  7. // this function is non-strict
  8. w = 34;
  9. }
  10. nonStrict();

識別子

識別子は次のとおり。アルファベットの大文字・小文字は区別される。関数名などに仮名・漢字も使える (が変態的)。

IdentifierName
IdentifierStart IdentifierPart*
IdentifierStart
UnicodeLetter | $ | _ | \ UnicodeEscapeSequence
IdentifierPart
IdentifierStart | UnicodeCombiningMark | UnicodeDigit | UnicodeConnectorPunctuation | <ZWNJ> | <ZWJ>

上の構文には「Unicode何とか」というのが出てくる。それぞれ、Unicode分類の次の文字が該当する;

UnicodeLetter Uppercase letter (Lu), Lowercase letter (Ll), Titlecase letter (Lt), Modifier letter (Lm), Other letter (Lo), Letter number (Nl)
UnicodeCombiningMark Non-spacing mark (Mn), Combining spacing mark (Mc)
UnicodeDigit Decimal number (Nd)
UnicodeConnectorPunctuation Connector punctuation (Pc)
JavaScript
[RAW]
  1. function 関数() {
  2. AA = 10; aa = 20;
  3. document.write('日本語', AA);
  4. }
  5. 関数();

実行結果:

日本語10

キーワード

JavaScript のキーワード (keyword) は次のものがある。プロパティ名、メソッド名、変数名などには使えない。

(2020.6 訂正) JavaScript のキーワードは、構文が曖昧でなければ、プロパティ名, メソッド名としても使うことができる。柔軟すぎる。JavaScript のオブジェクトはただの連想配列なので、値を設定するときは object[propname] と書けばよいし, object.propname で取り出すときは キーワードでも何ら問題ない。Promise#catch() など標準ライブラリにも名前が被っているものがある。

ES5:

break case catch continue debugger default delete do else false finally for function if in instanceof new null return switch this throw true try typeof var void while with

ES2015 (ES6) で追加: class const export extends import let static super yield

ES2017 (ES8) で追加: async await

async は文脈依存キーワード。変数名として使える。ただ、紛らわしいので, 新しいプログラムでは避けた方が無難。

キーワードとは別に, 将来の拡張のために予約された識別子 (future reserved word) がある。これらは, strictモードでは, キーワードと同様に、変数名などには使えない (エラーになる)。non-strictモードでは、変数名などとして使うことができる。

ES2017 (8th edition) の段階では、次の識別子が予約されている。

enum implements interface package private protected public

リテラル

正規表現リテラル

/」で囲んだ部分は正規表現リテラルになる。RegExpクラスのオブジェクトが生成される。Ruby と似ている。

構文が除算と曖昧。//= は、文脈によって判断される。

単一行コメントと曖昧。空の正規表現を生成したいときは, /(?:)/とする。

配列

●●後で書く。