5

私は JS を使い始めて以来、数値リテラルで関数を呼び出す唯一の方法は、次のようにかっこで囲んで式の位置に置くことだと考えていました。

1.toString();
// SyntaxError: identifier starts immediately after numeric literal

(1).toString();
// "1"

今日、これを試してみることにしました:

0.1.toString();
// "0.1"

なぜこれが機能するのですか?公式仕様へのポインタは素晴らしいでしょう。

Edit Ambiguity は私の最初の考えでしたが、1.toString()どちらにもあいまいさはないと判断しました。最初に思ったよりも深いですが、それでも自分は正しいと思います。理由は次のとおりです。

プロパティ名は数字で始めることができます

var obj = { "1" : 1, "2" : 2 };

数字で始まるプロパティ名は、角括弧でのみ参照できます

obj.1;
// SyntaxError: Unexpected token ILLEGAL
obj['1'];
// 1

また:

1['toString']();
// '1'

したがって、1.数字以外の後に続くのは、常にメソッド呼び出しまたはプロパティ アクセスであり、決して 10 進数ではありません。同様に、1.数字が続く場合は常に 10 進数であり、メソッド呼び出しやプロパティ アクセスではありません。

4

1 に答える 1

5

で最初.に表示される0.1と、後続の を番号の一部にする. ことはできません。

それはすべてあいまいさについてです。

編集— 仕様のセクション 7.8.3 は、これを明示的に主張しています。

NumericLiteral の直後のソース文字は、IdentifierStartまたはDecimalDigitであってはなりません。

それが何を防ごうとしているのか正確にはわかりませんが、主に正規表現リテラル文法と、それに対処するための奇妙なパーサー/レクサー ハックの必要性のおかげで、JavaScript 字句解析器はかなり厄介です。

于 2012-05-02T16:21:00.583 に答える