数値リテラルに直接メソッドを呼べない理由

(5).toString() がOKで 5.toString() がダメな理由を調べてみた。

まず (5) の ( ) は何なのか。これはグループ化演算子と呼ばれるもののようだ。

生成規則 PrimaryExpression : ( Expression) は、次のように評価される:

  1. Expression を評価。これは Reference 型でもよい。
  2. Result(1) を返す。

"( Expression )" は Expression の評価の結果を返す。(function(){ alert("hoge") })(); というコードで無名関数が実行できるのは、(function(){ alert("hoge") }) が無名関数を返すから。そして (5) はただ 5 という数値を返すだけ。

では、(5).toString() と 5.toString() は何が違うのか。数値に対してメソッド呼び出せば、内部的には数値が Number オブジェクトに変換されてメソッドが呼び出される。しかし 5.toString() のように数値リテラルに対して直接メソッドを呼ぶ事はできない。

リテラルの記述ルールにはこうある。

NumericLiteral に直接続くソース文字は、けして IdentifierStart や DecimalDegit ではない。

NumericLiteral に直接続くソース文字は DecimalDegit ではないとある。 "." はDecimalDegit に含まれる文字であるため、メソッド呼び出しの為のために "." を記述することはできない。つまり何の事はない、 5.toString() というコードは単なる ECMAScript の文法エラーということだ。