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)
識別子の2文字目以降に使える文字
  • UnicodeのID_Continueプロパティを持つ文字
  • $(U+0024 DOLLAR SIGN)
  • ゼロ幅非接合子(U+200C ZERO WIDTH NON-JOINER)
  • ゼロ幅接合子(U+200D ZERO WIDTH JOINER)

(いわゆるアンダースコア「_」はID_Continueプロパティを持つため、2文字目以降にも使えます。)

Unicodeの仕様も毎年のように改定されますが、ECMAScript仕様ではUnicodeの「最新バージョン」が参照されています。

Unicodeの識別子

UnicodeのID_StartID_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だけではありません。CC++PerlPythonRustなど多くのプログラミング言語がUAX #31を参照しています。これらの言語でもそのうち識別子に中黒が使えるようになるでしょう(\p{Word}との共通部分を採用しているPerlを除く)。

なお、JavaScript以外ではID_StartID_Continueプロパティではなく、XID_StartXID_Continueプロパティを参照していることが多いです。これらのプロパティは、ある識別子にUnicode正規化を適用しても識別子として有効であり続けることを保証するため、それぞれID_StartID_Continueプロパティからいくつかの文字を除外しています。

参考文献