为什么我不能用单个点访问整数的属性?

时间:2012-02-21 15:20:12

标签: javascript syntax

如果我试着写

3.toFixed(5)

存在语法错误。使用双点,放入空格,将三个放在括号中或使用括号表示法可以使其正常工作。

3..toFixed(5)
3 .toFixed(5)
(3).toFixed(5)
3["toFixed"](5)

为什么单点符号不起作用,而我应该使用哪一种替代方法呢?

5 个答案:

答案 0 :(得分:19)

句点是数字的一部分,因此代码将被解释为:

(3.)toFixed(5)

这自然会产生语法错误,因为您无法立即使用带有标识符的数字。

任何使句点不被解释为数字一部分的方法都可行。我认为最明确的方法是在括号周围加上括号:

(3).toFixed(5)

答案 1 :(得分:11)

由于JavaScript的tokenizer存在缺陷,您无法访问它。 Javascript尝试将数字上的点符号解析为浮点文字,因此您无法使用属性或方法对其进行跟踪:

2.toString(); // raises SyntaxError

正如您所提到的,有几种解决方法可以用来使数字文字也充当对象。任何这些都同样有效。

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

要了解对象使用和属性背后的更多信息,请查看Javascript Garden

答案 2 :(得分:4)

它不起作用,因为JavaScript将3.解释为浮点常量的开始(例如3.5)或者整个浮动 - 点常量(带3. == 3.0),因此您无法通过标识符(在您的情况下,属性名称)跟随它。它无法识别您希望3.是两个单独的令牌。

您的任何解决方法对我来说都很好。

答案 3 :(得分:2)

这是Javascript语法中的歧义。当解析器有一些数字然后遇到一个点时,它可以选择“NumberLiteral”(如3.5)或“MemberExpression”(如3.foo)。我想这种含糊不清是因为科学记法无法通过前瞻解决 - 应该3.e2被解释为300还是a property e2 of 3?因此他们自愿决定在这里选择NumberLiteral,因为实际上对3.foo之类的东西的需求不大。

答案 4 :(得分:0)

正如其他人所提到的,Javascript 解析器将 Integer 文字后的点解释为小数点,因此它不会调用 Number 对象上的方法或属性。

要明确通知 JS 解析器调用整数文字的属性或方法,您可以使用以下任何选项:


两点符号

3..toFixed()

用空格分隔

3 .toFixed()

将整数写成小数

3.0.toFixed()

用括号括起来

(3).toFixed()

赋值给常量或变量

const nbr = 3;

nbr.toFixed()