有人可以详细解释这里发生了什么吗?特别是双点表示法。
(3.14).toFixed(); // "3"
3.14.toFixed(); // "3"
(3).toFixed(); // "3"
3.toFixed(); // SyntaxError: Unexpected token ILLEGAL
3..toFixed(); // "3"
答案 0 :(得分:9)
根据ECMA Script 5.1 Specifications,十进制文字的语法定义如下
DecimalLiteral :: DecimalIntegerLiteral . [DecimalDigits] [ExponentPart] . DecimalDigits [ExponentPart] DecimalIntegerLiteral [ExponentPart]
注意:方括号仅表示部件是可选的。
所以,当你说
时3.toFixed()
在使用3.
后,解析器认为当前令牌是Decimal Literal的一部分,但只能跟DecimalDigits
或ExponentPart
。但它找到了t
,这是无效的,这就是它因 SyntaxError 而失败的原因。
当你做
时3..toFixed()
使用3.
后,会看到.
,称为属性访问者运算符。因此,它省略了可选的DecimalDigits
和ExponentPart
并构造了一个浮点对象并继续调用toFixed()
方法。
克服这个问题的一种方法是在数字之后留一个空格,比如
3 .toFixed()
答案 1 :(得分:8)
3.
是一个数字,因此.
是小数点,并且不会启动属性。
3..something
是一个后跟属性的数字。