【问题标题】:Why does 10..toString() work, but 10.toString() does not? [duplicate]为什么 10..toString() 有效,但 10.toString() 无效? [复制]
【发布时间】:2023-03-09 18:44:01
【问题描述】:

可能重复:
Usage of toString in JavaScript

152..toString(2)

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

152.toString(2)

抛出异常

"SyntaxError: 标识符在数字文字之后立即开始"

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

【问题讨论】:

  • 可能解析器试图将 10.[andsomething] 解释为浮点数......只是说
  • 因为当您想将文字数字转换为字符串时,您只需使用文字字符串(“10”)。又名,谁在乎呢。
  • @SJuan76 确实如此。将 10 括在括号中将起作用 (10).toString()
  • 这只是一个猜测,但解析器可能认为10.toString 中的toString 是分数的开始,而在后一种情况下,您将 0 作为分数,然后在浮点数上运行 toString .这可能意味着var n = 10.; 也有效(但从未尝试过)。
  • 10.0.toString() 也可以

标签: javascript syntax


【解决方案1】:

数字后面的. 可能看起来模棱两可。它是小数还是对象成员运算符?

但是,解释器决定它是一个小数,所以你缺少成员运算符。

它是这样看的:

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

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

(10.).toString();

@pedants 和 downvoters

. 字符表示歧义。可以理解为成员运算符,也可以是小数,视其位置而定。如果没有歧义,就没有问题可问。

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

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

【讨论】:

  • 为什么解释器会这样决定?有什么规范吗?我仍然没有任何意义,解释器应该把它当作一个属性来对待,因为它更有可能......
  • .不是模棱两可的。看我的回答。
  • @Alnitak:它提出了一种模棱两可的问题,因为在其他情况下看起来是相同字符的有效位置可能有两种不同的行为。我并不是说规范是模棱两可的。我是说语法是。歧义以指定的方式解决。
  • Lexers 不会处理歧义。 解析器就是这么做的。当这两个表达式到达解析器时,词法分析器已经明确决定将哪些字符分组到哪个标记中。
【解决方案2】:

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

<152.> 是合法令牌(不需要尾随 0),但 <152..> 不是,因此您的第一个示例简化为这一系列令牌:

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

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

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

这是非法的 - 没有句号将号码与 toString 调用分开。

【讨论】:

  • 这个是最清楚最准确的答案,应该超过user1689607一个就可以接受了。
  • 作为旁注,jsparse (jsparse.meteor.com) 有一个实时 js 词法分析器/解析器,您可以在其中看到 js 引擎解析“10”。作为一个数字。
  • @SzabolcsKurdi:那东西华丽
【解决方案3】:

10. 是一个float number,您可以在float 上使用toString

例如。

parseFloat("10").toString() // "10"

【讨论】:

  • 嗯 1 是一个 int,你也可以在 float 上调用 int,真正的问题是解析器的歧义,正如 user1689607 提到的那样
  • @JuanMendes:在javascript中没有int这样的东西
  • @thg435 没有称为int 的类型,但内部整数和浮点数的表示方式不同。我的观点是解析器读取的是整数,而10.toString() 是模棱两可的,无法判断 .用于属性访问或浮动的开始
  • @JuanMendes 词法分析器和解析器不会分别处理整数和浮点数。 JS 中根本没有“整数文字”这样的东西。
  • @JuanMendes(除非是十六进制)
猜你喜欢
  • 2016-09-18
  • 2020-06-17
  • 2021-11-06
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2014-01-12
  • 2022-08-17
  • 2022-01-12
相关资源
最近更新 更多