(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:
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 と似ている。
構文が除算と曖昧。/
と /=
は、文脈によって判断される。
単一行コメントと曖昧。空の正規表現を生成したいときは, /(?:)/
とする。