8

我写了一个简单的扩展方法。

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

987654321.toMillion()提出:

SyntaxError:意外的令牌非法

(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,您可能会认为这两种情况(.后跟一个数字,.后跟一个非数字字符)可以通过使用前瞻来区分。由于标识符不能以数字开头,如果数字字符跟在 后面,则.它必须是数字。如果非数字字符跟.在 后面,它不能是数字的一部分。但这并不完全正确。

在一种情况下,非数字字符可以跟随.字符但仍然是数字的一部分:

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

e表示后面是指数可以是小写也可以是大写。出于这个原因,使用前瞻必须考虑到如果跟随的字符.eor 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 回答