JavaScriptの識別子に中黒が使えるようになった ― 2024年06月07日 10時21分
JavaScriptの識別子(変数名、関数名、プロパティ名など)の2文字目以降に中黒「・」(U+30FB KATAKANA MIDDLE DOT)が使えるようになりました。以下のコードはChrome 124では構文エラーになりますが、Chrome 125では問題なく実行できます。
const シン・ゴジラ = 2016;
JavaScriptの識別子
中黒が使えるようになったのは、JavaScript(ECMAScript)の仕様が変わったからではありません。変わったのはUnicodeの仕様のほうです。Unicode 15.1.0(2023年9月)においてOther_ID_Continue
プロパティ(を持つ文字の集まり)に中黒が追加されました。
そもそもJavaScriptの識別子に使える文字は、Unicodeを参照して定義されています。ECMAScript 2023(2023年6月)では以下のようになっています。
- 識別子の1文字目に使える文字
-
- Unicodeの
ID_Start
プロパティを持つ文字 $
(U+0024 DOLLAR SIGN)_
(U+005F LOW LINE)
- Unicodeの
- 識別子の2文字目以降に使える文字
-
- Unicodeの
ID_Continue
プロパティを持つ文字 $
(U+0024 DOLLAR SIGN)- ゼロ幅非接合子(U+200C ZERO WIDTH NON-JOINER)
- ゼロ幅接合子(U+200D ZERO WIDTH JOINER)
- Unicodeの
(いわゆるアンダースコア「_」はID_Continue
プロパティを持つため、2文字目以降にも使えます。)
Unicodeの仕様も毎年のように改定されますが、ECMAScript仕様ではUnicodeの「最新バージョン」が参照されています。
Unicodeの識別子
UnicodeのID_Start
、ID_Continue
プロパティは、各種の「識別子」に使える文字として推奨されるものを表しており、UAX #31 Unicode Identifiers and Syntaxで以下の文字を含むものとして定義されています。
ID_Start
プロパティ-
- 一般カテゴリが
Letter
である文字 - 一般カテゴリが
Letter_Number
である文字 Other_ID_Start
プロパティを持つ文字- ただし
Pattern_Syntax
プロパティまたはPattern_White_Space
プロパティを持つ文字を除く(具体的にはⸯ
(U+2E2F VERTICAL TILDE)が除かれる)
- 一般カテゴリが
ID_Continue
プロパティ-
ID_Start
プロパティを持つ文字- 一般カテゴリが
Nonspacing_Mark
である文字 - 一般カテゴリが
Spacing_Mark
である文字 - 一般カテゴリが
Decimal_Number
である文字 - 一般カテゴリが
Connector_Punctuation
である文字 Other_ID_Continue
プロパティを持つ文字- ただし
Pattern_Syntax
プロパティまたはPattern_White_Space
プロパティを持つ文字を除く
ここでOther_ID_Start
プロパティとOther_ID_Continue
プロパティというのは、後方互換性のためにそれぞれID_Start
プロパティとID_Continue
プロパティに含めるべき文字を表しています。Other_ID_Continue
プロパティに中黒(U+30FB)が追加されたことで、巡り巡ってJavaScriptの識別子に中黒が使えるようになったのです。
なお、中黒だけでなくゼロ幅非接合子(U+200C)とゼロ幅接合子(U+200D)も追加されたため、ECMAScript 2024以降では識別子の2文字目以降に使える文字の定義が「UnicodeのID_Continue
プロパティを持つ文字または$
(U+0024 DOLLAR SIGN)」と簡潔になる予定です。
過去にも識別子に中黒が使えた
ID_Continue
プロパティの後方互換性のために中黒が追加されたということは、さらに以前は中黒がID_Continue
プロパティに含まれていたのでしょうか?
まさにその通りで、Unicode 4.0.1(2004年5月)以前は中黒の一般カテゴリがConnector_Punctuation
になっており、結果としてID_Continue
プロパティに含まれていました。Unicode 4.1.0(2005年3月)で中黒の一般カテゴリがOther_Punctuation
に変更され、ID_Continue
プロパティに含まれなくなっていたのです。
ECMAScript 5.1ではUnicode 3.0以上への適合が求められていたため、ECMAScript 3(1999年12月)~5.1(2011年6月)の間は中黒を識別子に使えた可能性があります。(ECMAScript 2(1998年8月)以前はASCIIの範囲内の文字のみ識別子に使用可能、ECMAScript 2015(ES6、2015年6月)以降はUnicode 5.1.0以上への適合が求められる。)
他のプログラミング言語の識別子
識別子の定義にUAX #31を参照しているのはJavaScriptだけではありません。C、C++、Perl、Python、Rustなど多くのプログラミング言語がUAX #31を参照しています。これらの言語でもそのうち識別子に中黒が使えるようになるでしょう(\p{Word}
との共通部分を採用しているPerlを除く)。
なお、JavaScript以外ではID_Start
、ID_Continue
プロパティではなく、XID_Start
、XID_Continue
プロパティを参照していることが多いです。これらのプロパティは、ある識別子にUnicode正規化を適用しても識別子として有効であり続けることを保証するため、それぞれID_Start
、ID_Continue
プロパティからいくつかの文字を除外しています。
参考文献
- UAX31: Unicode Identifier の話 | ++C++; // 未確認飛行 C ブログ
- UTC #176 properties feedback & recommendations (PDF)——「2.2 Katakana middle dots in XID_Continue」において、中黒が識別子に使えなくなったのは「うっかり(accidentaly)」だったと述べられている。
- PropList-4.0.1.txt——中黒(U+30FB)の一般カテゴリが
Connector_Punctuation
(Pc
)であることを確認 - PropList-4.1.0.txt——中黒(U+30FB)の一般カテゴリが
Other_Punctuation
(Po
)であることを確認 - PropList-15.0.0.txt——
Other_ID_Continue
プロパティに中黒(U+30FB)が含まれないことを確認 - PropList-15.1.0.txt——
Other_ID_Continue
プロパティに中黒(U+30FB)が含まれることを確認
最近のコメント