JavaScript おれおれ Advent Calendar 2011 – 12日目

というわけで、123.toString()は駄目だけど、ドット.を二つにした123..toString()はvalidです。

なんでかっていうと、123.までが数値として解釈されるから、です。

ですから123.toString()というコードは、123.という数値の直後にメソッド名toStringが出現する、と解釈されるため、パースエラーになっちゃいます。次のコードと等価です。

(123.)toString()

ドット.を二つにすると123.という数値の次にはドット演算子.があって、それからメソッド名が出現すると解釈されますので、123.に対してNumber.prototypeのtoString()が呼び出される事になります。

(123.).toString()

このあたり、JavaScript: The Good Partsの「2.3 数値」の図がわかりやすいです。