2012-10-11 9 views
8

私は簡単な拡張メソッドを書いた。JavaScriptの987と(987)の違いは何ですか?

Number.prototype.toMillion = function(){ 
if(!Number.isNaN){ 
    return this/1000000; 
} 
} 

987654321.toMillion()提起:

SyntaxError: Unexpected token ILLEGAL

しかし(987654321).toMillion()作品を。

私の質問は:987(987)の違いは何ですか?ただ、FYI

typeof(987) => returns "number" 

そして

typeof((987)) still returns "number" 
+2

なぜ「Number.isNaN」をチェックしていますか? 'this.isNaN()'を意味しますか? – David

+0

以下の答えに加えて、 '987654321..toMillion()' – Izkata

+1

@Davidをチェックしてください。 'isNaN(this)'(これはグローバル関数であり、 'Number.prototype'のプロパティではありません)です。 –

答えて

11

がどのようにパーサは.文字以下の部分はメソッド呼び出しの代わりに、多数の別の部分を意味することを意図していることを知っているだろうか?例:

10.1 // This is a number with a floating point 
10.toMillion() //How does it know that this shouldn't be part of the number? 

このため、数値リテラルのメソッドを呼び出すことはできません。リテラルをカッコで囲んで(grouping operator)、ランタイムは含まれている式を評価し、その評価の結果にメソッドを適用します。

グループ化演算子は、.文字のあいまいさを削除します。


更新

いくつかの考えやスペックを通していくつかの調査に続き、先読みの使用は何.文字の後に続くことは番号の一部であるかどうかを判断することはできませ正当な理由がありますまたはプロパティ識別子。

@ CygnusX1がコメントに記載されているように、2つの状況(.の後ろに数字と.のあとに数字以外の文字が続きます)は先読みの使用によって区別できます。識別子は数字で始めることができないので、数字が.に続く場合は数字でなければなりません。数値以外の文字が.の後に続く場合は、数値の一部にすることはできません。しかしそれは全く正しいことではありません。

非数値文字が.文字をたどるが、それでも数の一部とすることができたもので、状況があります:

console.log(1.e5); // Logs '100000' 

eは次にくるものが指数であることを示し、それができます小文字でも大文字でもかまいません。このため、先読みを使用すると、.に続く文字がeまたはEである場合でも、メソッドまたは数値の一部を表す可能性があることを考慮する必要があります。数値リテラルのプロパティの使用を禁止するほうが簡単です。

+0

あなたはそれに私を打つ;) –

+0

パーサは先読みをすることによってそれを決定することができます。要素の後の要素が識別子の場合、ドットは数値の一部であってはなりません。しかし、Torsten Walterの例によると、メンバーは自分自身で数値を取ることができるため、これはもはや不可能です。 – CygnusX1

+0

@ CygnusX1 - Torstenの2番目の例は構文エラーです。そのような数値プロパティは定義できません(識別子は数値で始めることができないため)。 –

5

.はJavaScriptでオーバーロードされています。

123.123   // the interpreter assumes this is a floating point number 
(123).123  // throws a syntax error, since an identifier 
       // can't start with a number. - thanks James for pointing that out 
(123).toMillion // refers to the function of the object returned by 
       // the statement in braces 
123.toMillion // will throw a syntax error because a floating point number has only digits 
+1

識別子が数字で始めることはできないので、2番目の例では実際には構文エラーがスローされることに注意してください。 –

1

987654321.toMillion()を解析すると、「ピリオド」は小数点の区切り文字として解釈されます。したがって、オブジェクトとして数値を使用する場合は、中括弧で囲む必要があります。

関連する問題