👀

JavaScriptにおいて0は識別子ではないことを確認する

2021/11/30に公開

はじめに

本記事は「筆者がJavaScriptにおいて0は識別子ではないことを確認した際の過程」を記述したものです。

本記事を書いた動機

  • SNSにて「JavaScriptにおいて0は識別子ではない」という趣旨の発言を見かけ、ちょうど筆者がECMAScript仕様書を読む練習をしていたこともあり、仕様書で確認してみたくなったため。
  • 「ECMAScript仕様書を読みたいと考えているものの、読むことへ抵抗がある人」が本記事を読むことを通し、順を追って仕様を読み解く体験をすることで、仕様書を読む抵抗を取り去る助けになるかもしれないと考えたため。

ECMAScript仕様書を確認する

  • ECMAScript 2022 Language Specification

https://tc39.es/ecma262/

識別子とはidentifierを日本語に訳したものであると考えられる。ECMAScript仕様書の検索ボックスにidentifierと入力すると最上位に以下の項目が表示される。

  • Identifier

このリンクを訪問すると以下の記述を読むことができる。

Identifier :
IdentifierName but not ReservedWord
(https://tc39.es/ecma262/#prod-Identifier)

この定義から

  • IdentifierNameの定義に0が含まれていなければ「0は識別子ではない」と言える。
  • ReservedWordの定義に0が含まれていれば「0は識別子ではない」と言える。

ということを読み取ることができる。

まず、IdentifierNameの定義を調べる。IdentifierNameの定義は以下のようになっている。

IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
(https://tc39.es/ecma262/#prod-IdentifierName)

IdentifierNameは必ずIdentifierStartで始まることがわかる。0は1字であり0で始まるため、IdentifierStartに0が含まれないことが判明すれば「0は識別子ではない」と言える。

IdentifierStartの定義は以下のようである。

IdentifierStart ::
IdentifierStartChar
\ UnicodeEscapeSequence
(https://tc39.es/ecma262/#prod-IdentifierStart)

当然0は\で始まることは決してないため、0は\ UnicodeEscapeSequenceに含まれない。したがって、IdetifierStartCharに0が含まれないことがわかれば0は識別子ではないことがわかる。

IdentifierStartCharの定義は以下のようである。

IdentifierStartChar ::
UnicodeIDStart
$
_
(https://tc39.es/ecma262/#prod-IdentifierStartChar)

$と_は0ではない。したがってUnicodeIDStartに0が含まれていないことがわかれば0は識別子ではないことがわかる。

UnicodeIDStartの定義は以下のようである。

UnicodeIDStart ::
any Unicode code point with the Unicode property “ID_Start”
(https://tc39.es/ecma262/#prod-UnicodeIDStart)

「UnicodeIDStartはUnicode propertyであるID_Startを伴っている全てのUnicode code point」である。したがって、 「Unicode propertyであるID_Startを伴っている全てのUnicode code point」に0が含まれないことがわかれば0は識別子ではないことがわかる。

Unicodeを確認する

UNICODE CHARACTER DATABASE(https://unicode.org/reports/tr44/)に"the Unicode property ID_Start"に関する記述がある。

Property Table(https://unicode.org/reports/tr44/#Property_List_Table)によれば、ID_StartはDerivedCoreProperties.txt(https://www.unicode.org/Public/14.0.0/ucd/DerivedCoreProperties.txt)においてその定義を見ることができる。

また、0のUnicode code pointを調べるとU+0030であるとわかる。
(https://www.unicode.org/Public/14.0.0/ucd/UnicodeData.txt より)

DerivedCoreProperties.txtのID_Startの定義を見ると以下の記述から始まっている。

0041..005A ; ID_Start # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z

番号は昇順に並んでおりU+0041から始まっているため、U+0030はID_Startに含まれないことがわかる。したがって、JavaScriptにおいて0は識別子ではない

最後に

以上よりJavaScriptにおいて0は識別子ではないことを確認することができました。

最後に「ECMAScript仕様書を読みたいがいまいち読み方がわからない。どこから読めばよいのかわからない。」という方に向け、ECMAScript仕様書を読むにあたり大きな助けとなるであろう資料を紹介します。

  • ECMAScriptの仕様/プロポーザルの調べ方を知る

https://efcl.info/2018/03/07/ecmascript-usage/

  • How to Read the ECMAScript Specification

https://timothygu.me/es-howto/

  • Understanding the ECMAScript specの一連の記事

https://v8.dev/blog/tags/understanding-ecmascript

  • ECMAScript仕様書[1]

https://tc39.es/ecma262/

脚注
  1. ECMAScript仕様書のことを知るにはECMAScript仕様書を読むとよいです。仕様書の始めの方に配置されているIntroduction、Overview、Notational Conventions、ECMAScript Data Types and Valuesあたりをしっかり読むと、以降の部分を理解するのに役立つはずです。 ↩︎

Discussion