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

IT技术 javascript syntax
2021-02-04 23:07:58

如果我尝试写

3.toFixed(5)

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

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

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

5个回答

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

(3.)toFixed(5)

这自然会产生语法错误,因为您不能立即使用标识符跟随数字。

任何防止将句点解释为数字一部分的方法都可以使用。我认为最清楚的方法是在数字周围加上括号:

(3).toFixed(5)

您无法访问它,因为 JavaScript 的标记器存在缺陷。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

您的大部分答案实际上是在重复 OP 已经说过的事情。. .
2021-04-01 23:07:58
但他解释了为什么它有效,例如没有隐式转换在起作用。
2021-04-08 23:07:58

它不起作用,因为 JavaScript 将 the 解释3.为浮点常量的开头(例如3.5)或整个浮点常量(with 3. == 3.0),因此您不能在它后面跟一个标识符(在您的情况下) , 属性名称)。它无法识别您希望 the3和 the.成为两个单独的令牌。

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

这是 Javascript 语法中的歧义。当解析器得到一些数字然后遇到一个点时,它可以在“NumberLiteral”(如 3.5)或“MemberExpression”(如 3.foo)之间进行选择。我想由于科学记数法的原因,这种歧义无法通过前瞻来解决 - 应该3.e2解释为300a property e2 of 3因此他们自愿决定选择NumberLiterals 这里,只是因为实际上对3.foo.

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

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


两点符号

3..toFixed()

用空格分隔

3 .toFixed()

将整数写为小数

3.0.toFixed()

括在括号中

(3).toFixed()

分配给常量或变量

const nbr = 3;

nbr.toFixed()