| (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種類。
/*」から「*/」まで。入れ子にはできない。
//」から行末まで. 文法が正規表現リテラルと曖昧だが、どちらとも解釈できる場合は, 単一行コメントが優先される。正規表現にするときは適宜エスケープが必要。
JavaScriptの文は「;」(セミコロン)で区切る。正しくは, 文はセミコロンで終わる (文の一部)。
しかし、セミコロンが必要な箇所に存在しなくても, エラーにならない場合がある。JavaScript のおせっかい機能で、行末にセミコロンがないときは、文脈から次の行に続いていることが明らかな場合を除き、セミコロンが自動的に挿入される (automatic semicolon insertion)。
上の例のように, returnの直後の改行など、文が継続していると解釈できる場合であっても、自動セミコロン挿入されてしまう。意図していない場合があり、まったくよくない機能。しかし、過去との互換性のため, strictモードでも行われる。
strictモードは, JavaScript の悪い慣習を, 意図してエラーにする。新しいコードを書く場合、常に有効にすべき。
スクリプトファイル全体または個別の関数単位で適用できる。フレームワークが出力時にファイルを連結するなどで, non-strict なコードが混ざる場合は関数単位で有効にし、そうでない場合はファイル全体で有効にする。
ファイル全体に適用するには、ファイルの冒頭に、"use strict"; と書く。
関数単位は、関数の冒頭で同様に書く。
識別子は次のとおり。アルファベットの大文字・小文字は区別される。関数名などに仮名・漢字も使える (が変態的)。
$ | _ | \ UnicodeEscapeSequence
上の構文には「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) |
実行結果:
日本語10
JavaScript のキーワード (keyword) は次のものがある。プロパティ名、メソッド名、変数名などには使えない。
(2020.6 訂正) JavaScript のキーワードは、構文が曖昧でなければ、プロパティ名, メソッド名としても使うことができる。柔軟すぎる。JavaScript のオブジェクトはただの連想配列なので、値を設定するときは object[propname] と書けばよいし, object.propname で取り出すときは キーワードでも何ら問題ない。Promise#catch() など標準ライブラリにも名前が被っているものがある。
ES5:
breakcasecatchcontinuedebuggerdefaultdeletedoelsefalsefinallyforfunctionifininstanceofnewnullreturnswitchthisthrowtruetrytypeofvarvoidwhilewith
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) の段階では、次の識別子が予約されている。
enumimplementsinterfacepackageprivateprotectedpublic
「/」で囲んだ部分は正規表現リテラルになる。RegExpクラスのオブジェクトが生成される。Ruby と似ている。
構文が除算と曖昧。/ と /= は、文脈によって判断される。
単一行コメントと曖昧。空の正規表現を生成したいときは, /(?:)/とする。