【问题标题】:JavaScript JSON.parse string bug - convert value to InfinityJavaScript JSON.parse 字符串错误 - 将值转换为 Infinity
【发布时间】:2021-04-22 04:53:28
【问题描述】:

谁能解释一下 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 认为这是一种浮动?

【问题讨论】:

  • 很可能是因为 10e6 类型的字符串是一个有效的数值,因为它表示 10 的 6 次幂。但 d 或 f 在这里没有有效意义。因此 JSON 解析将第二种情况视为 js 中的有效数字,因此这种行为
  • 是的。 JSON 支持电子符号数字(例如1e3 == 1000),第二个输入匹配general pattern for them。不过,指数 130012727947 太大而无法容纳 64 位浮点数,因此默认为 Infinity。
  • 在您的情况下,数字太大而无法表示为数值,因此为避免溢出错误,它被转换为 INFINITY ,这是 js 中的最大值
  • "5ffc58ed1662010012d45b30" 这是无效的 JSON。类型无效json.org/json-en.html
  • 问题中提供的 JSON 中没有任何字符串。

标签: javascript json infinity


【解决方案1】:

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 解析器在到达索引 1 处的第一个 f 字符时会引发错误。

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

【讨论】:

    【解决方案2】:

    基本上是把第二个字符串当成一个大数

    【讨论】:

      猜你喜欢
      • 2016-06-07
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2015-02-18
      相关资源
      最近更新 更多