JSON忽略了Infinity和NaN;在ECMAScript中JSON状态如何?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (37)

你知道为什么JSON忽略了NaN和+/-Infinity吗?它将Javascript置于一种奇怪的情况下,即如果对象包含NaN或+/-无穷大值,否则这些对象是不可序列化的。

有限数被串成字符串,就像通过调用ToString(number)...和无限,无论符号是什么,都表示为字符串。null...

提问于
用户回答回答于

因为这是JSON中不幸的遗漏。IEEE 754将这些定义为浮点数的三个特殊值。因此,JSON不能完全表示IEEE 754浮点数。实际上更糟糕的是,因为ECMA 262 5.1中定义的JSON甚至没有定义它的数字是否基于IEEE 754。由于ECMA 262中描述的strangfy()函数的设计流程确实提到了三个特殊的IEEE值,因此人们可以怀疑其意图实际上是支持IEEE 754浮点数。

作为另一个数据点,与以下问题无关:xml数据类型xs:Float和xs:Double do声明它们基于IEEE 754浮点数,并且它们确实支持这三个特殊值的表示。

用户回答回答于

InfinityNaN不是关键字或任何特殊的东西,它们只是全局对象上的属性(如下面所示)undefined),因此可以更改。正是因为这个原因,JSON没有将它们包含在规范中--本质上,任何真正的JSON字符串在ECMAScript中都应该具有相同的结果。eval(jsonString)JSON.parse(jsonString).

如果允许的话,那么有人可以注入类似于

NaN={valueOf:function(){ do evil }};
Infinity={valueOf:function(){ do evil }};

扫码关注云+社区