Jas*_*n S 161 javascript json ecma262
知道为什么JSON遗漏了NaN和+/- Infinity?它将Javascript放在奇怪的情况下,否则,如果它们包含NaN或+/-无穷大值,那么否则可以序列化的对象不会.
看起来像是一成不变的:见RFC4627和ECMA-262(第24.3.2节,JSON.stringify,第4节,第507页,最后编辑):
有限数字通过调用进行字符串化
ToString(number)
.无论符号如何,NaN和Infinity都表示为Stringnull
.
oll*_*iej 87
Infinity
并且NaN
不是关键字或任何特殊的,它们只是全局对象上的属性(按原样undefined
),因此可以更改.这是因为这个原因JSON不包括他们在规范-在本质上,如果你做任何真正的JSON字符串应该具有的EcmaScript相同的结果eval(jsonString)
或JSON.parse(jsonString)
.
如果它被允许那么有人可以注入类似的代码
NaN={valueOf:function(){ do evil }};
Infinity={valueOf:function(){ do evil }};
Run Code Online (Sandbox Code Playgroud)
进入一个论坛(或其他),然后该网站上的任何json使用可能会受到损害.
小智 54
在最初的问题上:我同意用户"cbare",因为这是JSON中遗憾的遗漏.IEEE754将这些定义为浮点数的三个特殊值.所以JSON不能完全代表IEEE754浮点数.事实上更糟糕的是,因为ECMA262 5.1中定义的JSON甚至没有定义它的数字是否基于IEEE754.由于为ECMA262中的stringify()函数描述的设计流程确实提到了三个特殊的IEEE值,因此可以怀疑其意图实际上是支持IEEE754浮点数.
作为另一个与问题无关的数据点:XML数据类型xs:float和xs:double表示它们基于IEEE754浮点数,并且它们支持这三个特殊值的表示(参见W3C XSD 1.0第2部分) ,数据类型).
Zoi*_*erg 16
你可以调整空对象模式,并在你的JSON中表示这样的值
"myNum" : {
"isNaN" :false,
"isInfinity" :true
}
Run Code Online (Sandbox Code Playgroud)
然后在检查时,您可以检查类型
if (typeof(myObj.myNum) == 'number') {/* do this */}
else if (myObj.myNum.isNaN) {/* do that*/}
else if (myObj.myNum.isInfinity) {/* Do another thing */}
Run Code Online (Sandbox Code Playgroud)
我知道在Java中你可以覆盖序列化方法以实现这样的事情.不确定序列化的位置,所以我不能详细介绍如何在序列化方法中实现它.
teh*_*aus 11
字符串"Infinity"," - Infinity"和"NaN"都强制转换为JS中的预期值.所以我认为在JSON中表示这些值的正确方法是字符串.
> +"Infinity"
Infinity
> +"-Infinity"
-Infinity
> +"NaN"
NaN
Run Code Online (Sandbox Code Playgroud)
遗憾的是,JSON.stringify不会这样做.但有一种方法:
> JSON.stringify({ x: Infinity }, function (k,v) { return v === Infinity ? "Infinity" : v; })
"{"x":"Infinity"}"
Run Code Online (Sandbox Code Playgroud)
如果您有权访问序列化代码,则可能将Infinity表示为1.0e + 1024.指数太大而不能表示为double,而当反序列化时,它表示为Infinity.适用于webkit,不确定其他json解析器!
原因在标准 ECMA-404 The JSON Data Interchange Syntax, 1st Edition 的第 ii 页中说明
JSON 与数字无关。在任何编程语言中,都可以有各种容量和补码的各种数字类型,固定或浮动,二进制或十进制。这会使不同编程语言之间的互换变得困难。相反,JSON 仅提供人类使用的数字表示:数字序列。所有编程语言都知道如何理解数字序列,即使它们在内部表示上存在分歧。这足以允许互换。
原因并不像许多人声称的那样,是由于NaN
和Infinity
ECMA 脚本的表示。简单是 JSON 的核心设计原则。
因为它非常简单,所以预计 JSON 语法永远不会改变。这为 JSON 作为基础符号提供了极大的稳定性
归档时间: |
|
查看次数: |
62587 次 |
最近记录: |