为什么 10..toString() 有效,而 10.toString() 无效?

IT技术 javascript syntax
2021-02-05 16:18:48

可能的重复:
在 JavaScript 中使用 toString

152..toString(2)

正确创建二进制字符串“10011000”,但

152.toString(2)

抛出异常

“语法错误:标识符在数字文字之后立即开始”

为什么?后者的语法实际上听起来更正确,而前者看起来很奇怪!

3个回答

.数字后的A可能看起来不明确。它是十进制还是对象成员运算符?

但是,解释器决定它是一个小数,因此您缺少成员运算符。

它认为它是这样的:

(10.)toString();  // invalid syntax

当您包含第二个时.,您有一个小数,后跟成员运算符。

(10.).toString();

@pedants 和downvoters

. 角色提供了一个含糊不清可以理解为成员运算符,也可以理解为小数,这取决于它的位置。如果没有歧义,就没有问题要问了。

规范.对该特定位置字符的解释是它将是一个小数。这是由 ECMAScript 的数字文字语法定义的。

仅仅因为规范解决了 JS 解释器的歧义,并不意味着.字符的歧义根本不存在。

为什么口译员如此决定?有没有关于那个的规范?我对我来说仍然没有意义,口译员应该把它当作财产来对待,因为它更有可能......
2021-03-21 16:18:48
词法分析器不会处理歧义。 解析器就是这样做的。当这两个表达式到达解析器时,词法分析器已经明确决定将哪些字符分组到哪个标记中。
2021-03-25 16:18:48
.明确的。看我的回答。
2021-04-06 16:18:48
@Alnitak:它存在歧义,因为否则看起来是同一角色的有效位置可能有两种不同的行为。我并不是说规范是模棱两可的。我是说语法是。歧义以指定的方式解决。
2021-04-06 16:18:48

词法分析器(又名“分词器”)在读取新标记时,并在第一次找到数字时,将继续使用字符(即数字或一个点),直到它看到不是合法数字一部分的字符

<152.>是一个合法的标记(尾随 0 不是必需的)但<152..>不是,所以你的第一个例子简化为这一系列的标记:

<152.> <.> <toString> <(> <2> <)>

这是合法的(和预期的)序列,而第二个看起来像

<152.> <toString> <(> <2> <)>

这是非法的 - 没有将号码与toString呼叫分开的句点标记

@SzabolcsKurdi:那东西真漂亮
2021-03-28 16:18:48
这是最清晰、最准确的答案,应该被user1689607接受了。
2021-04-04 16:18:48
作为旁注,jsparse ( jsparse.meteor.com ) 有一个实时 js 词法分析器/解析器,您可以在其中看到 js 引擎解析“10”。作为一个数字。
2021-04-09 16:18:48

10.是一个float number你可以使用 toString 的float

例如。

parseFloat("10").toString() // "10"
@JuanMendes(除非它是十六进制的)
2021-03-15 16:18:48
@JuanMendes:intjavascript 中没有这样的东西
2021-03-21 16:18:48
嗯 1 是一个 int,你也可以在一个浮点数上调用 int,真正的问题是解析器的歧义,正如 user1689607 提到的
2021-03-23 16:18:48
@JuanMendes 词法分析器和解析器不会分别处理整数和浮点数。JS 中根本没有“整数文字”这样的东西。
2021-03-24 16:18:48
@thg435 没有称为 的类型int,但内部整数和浮点数的表示方式不同。我的观点是解析器读取的是一个整数,并且10.toString()不明确,无法判断 . 用于属性访问或浮动的开始
2021-04-07 16:18:48