8

簡単な拡張メソッドを書きました。

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

987654321.toMillion()レイズ:

SyntaxError: 予期しないトークン ILLEGAL

しかし、(987654321).toMillion()動作します。

987だから私の質問は:との違いは何(987)ですか?

参考までに:

typeof(987) => returns "number"

typeof((987)) still returns "number"
4

3 に答える 3

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?

そのため、数値リテラルでメソッドを呼び出すことはできません。リテラルを括弧 (グループ化演算子) で囲むことにより、ランタイムは含まれている式を評価し、その評価の結果にメソッドを適用します。

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


アップデート

仕様を検討し、調査した結果、文字の後に続くもの.が数値の一部であるかプロパティ識別子であるかを判断するために、先読みの使用を許可しない十分な理由があります。

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

数字以外の文字が文字の後に続くが、数字の.一部である場合が 1 つあります。

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

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

于 2012-10-11T09:02:43.600 に答える
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
于 2012-10-11T09:02:46.697 に答える
1

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

于 2012-10-11T09:03:26.977 に答える