所以我不能将Infinity作为数字放入JSON,可以吗?

Adr*_*ley 1 javascript json infinity node.js

我设法找到了一个错误(可能不是错误,但麻烦重重),花了很长时间才能找到答案,并且可以使用REPL(NodeJS)复制它:

> o = {};
{}

> JSON.stringify(o)
'{}'

> o.n = 10
10

> JSON.stringify(o)
'{"n":10}'

> o.n = Infinity;
Infinity

> JSON.stringify(o)
'{"n":null}'

> null == Infinity
false

> null === Infinity
false

> typeof 10
'number'

> typeof Infinity
'number'
Run Code Online (Sandbox Code Playgroud)

当您将其Infinity放入JSON时null,尽管Infinity是一种number类型,它仍会变为。通常情况下,谁在乎,但是当-InfinityNaN0,并且Infinity都在你的应用程序(机器学习)的背景下特殊的意义,它能够传送特别号码为纯JSON是很重要的,而不诉诸馅和拆箱它变成每一次的字符串。

字符串填充需要对每次访问进行额外的类型检查,然后将开关案例字符串与所有特殊数字类型进行比较,然后将其重新分配为实际的特殊数字类型。一次还不错,每分钟40或50万亿次是您真正开始诅咒ECMA之神的地方。

我是否缺少某些东西,或者这仅仅是ECMA认为不是那么重要的事情之一?

Adr*_*ley 5

显然,这是故意的:

http://www.ecma-international.org/publications/standards/Ecma-404.htm

JSON与数字无关。在任何编程语言中,可以有各种容量和补码形式的数字类型,固定或浮动,二进制或十进制。这会使不同编程语言之间的交换变得困难。JSON而是仅提供人类使用的数字表示形式:数字序列。所有编程语言都知道如何理解数字序列,即使它们在内部表示形式上存在分歧。这足以允许互换。

  • 提出这个推理的人都不做功课。一切都支持[IEEE 754](https://en.wikipedia.org/wiki/IEEE_754)浮点数,该浮点数支持NaN,-0,-Inf和Inf。 (3认同)