JavaScript JSON.parse 字符串错误 - 将值转换为 Infinity

问题描述

谁能解释一下 JavaScript 中 JSON.parse() 函数中的这种奇怪行为?

当用字符串调用它时,它应该引发一个错误

例如

JSON.parse("5ffc58ed1662010012d45b30"); 

结果:

VM230:1 Uncaught SyntaxError: Unexpected token f in JSON at position 1
    at JSON.parse (<anonymous>)
    at <anonymous>:1:6

... 但是!!

当我用这个特定的值调用它时:

JSON.parse("60000528880e130012727947");

它返回Infinity???为什么???这怎么可能?这个字符串有什么特别之处? 这是因为这个 string 完全由数字和中间的 e 组成吗?所以JSON.parse认为这是一种浮动?

enter image description here

解决方法

JSON 是相同数据的文本表示,通常是像数组或对象这样的结构,但像字符串或数字这样的原始值也可以毫无问题地表示为 JSON。

作为文本,在源代码中它表示为 JavaScript 字符串。
行:

JSON.parse("60000528880e130012727947");

也可以是 JSON.parse(x),其中 x 是一个包含 JSON 的变量。

上面示例中的 JSON 正是这样:60000528880e130012727947(它周围没有引号,引号是 JavaScript 源代码中文本的表示方式)。更准确地说,它是实数 60,000,528,880 * 10^130,012,727,947 的文本表示。

JavaScript 使用 double-precision 64-bit binary format IEEE 754 来表示数字。 Number 可以容纳的最大值约为 1.8×10^308,这对于大多数实际用途而言非常有用。但是,与您表示为 JSON 的值相比,它是一个很小的值。
无论如何,不​​管它有多大,由于存储为 JSON 的值大于使用 64 位双精度格式可以表示的最大值,因此使用 Infinity 代替。

关于另一个示例,5ffc58ed1662010012d45b30 不是数字的有效表示,因此 JSON 解析器在到达索引 f 处的第一个 1 字符时会抛出错误。>

总而言之,JSON.parse() 工作正常,您的输入并不总是有效的 JSON。

,

基本上是将第二个字符串视为一个大数字