2012-05-02 16 views
5

私はJSでの作業を開始して以来、私はリテラルの数に機能を呼び出すための唯一の方法を考えたがそうのように、括弧でそれをラップすることにより、表現の位置にそれを置くことです:JSの数値リテラルで関数を呼び出すルールは何ですか?

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

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

今日、それを

0.1.toString(); 
// "0.1" 

これはなぜ機能しますか?公式スペックへのポインタは素晴らしいでしょう。

編集曖昧さが私の最初の考えでしたが、その後1.toString()にもあいまいさがないと判断されました。それは私が最初に思ったより深いですが、私はまだ私が正しいと思います。 数字で始まる

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

プロパティ名のみが角括弧また

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

で参照することができる数字で始めることができ

プロパティ名:なぜここにあります

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

したがって、1.に続く任意の非数字は、常にメソッド呼び出しまたはプロパティアクセスであり、決して10進数ではありません。同様に、1.に続けて任意の数字を指定すると、常に10進数になりますが、メソッド呼び出しやプロパティアクセスにはなりません。

+1

注: '.toString()'を使うことができます。最初の '.'は小数点を示し、2番目は小数点を示します。 – zzzzBov

+1

関連:http://stackoverflow.com/q/2300197 – CMS

+0

賢い、ありがとうzzzzBovとCMS。 – mwcz

答えて

5

それは0.1の最初の.を見ていたら、その後の.は、数値の一部にすることはできません。

すべてがあいまいです。スペックの

編集 —セクション7.8.3は、明示的に主張している:

すぐNumericLiteral以下のソース文字がIdentifierStartまたはDecimalDigitあってはなりません。

私はそれが予防しようとしている正確にわからないんだけど、JavaScriptのレクサーは、正規表現リテラルの文法とそれに対処するための奇妙なパーサレクサーの必要ハックに主に感謝かなり危ないです。

+0

ここにあいまいさはないと思います。私の質問を推論で更新する。私は仕様からその文を混同しています... '0.1.toString()'は有効ですが、NumericLiteralの直後にDecimalDigitが続くように見えます。 – mwcz

+0

@mwczはい、私は*明らかなあいまいさがないことに同意しますが、そのケースがエラーとして扱われるという主張についてのあいまいな理由があるかもしれません。この仕様は実際の詳細には含まれません。 '0.1.toString'は数値リテラルとそれに続く10進数字ではありません。数字リテラルとそれに続く10進数字でも識別子の開始でもない' .'文字が続きます。 – Pointy

+0

ああ、ありがとう。私は '.'を見て、それを' .'と区別できませんでした。私はあなたがそれに独立して到着したと推測していますが、曖昧さに対して推論を追加しました。 – mwcz

関連する問題