Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JSON在数值类型存储上的局限性

  早期人们要想将结构化的数据转换成文本储存会考虑使用XML,而现更多人会选用JSON。对于一般的结构化数据而言,JSON已经足够了。但在JSON中,数值类型的数据存储并不理想,因为一些特殊值无法通过字面量来描述,而且标准的stringify算法中抛弃了特殊值。
  JSON中的三大基本类型就是JavaScript的那三个:BooleanStringNumberBoolean类型的值就两个,truefalse,所以没什么问题。String的值本身也没什么问题,只是词法被做了限制,比如不能使用单引号来包裹字符串内容、不支持“\xHH”和“\OOO”形式的转义字符等,不过使用起来并没有什么问题。Number类型虽然在词法上也有一些约定,比如小数点附近的零不能省略,不能有多余的正号等,但更关键的是它的一些值被强制禁止了。在标准的stringify算法中对于Number类型的数据会判断其是否满足isFinite,对于不满足的情况一律替换为null,这就把特殊值给排除了。所以标准的stringify算法无法处理NaNInfinity这两个特殊值。
  但这并不意味着JSON不支持,Infinity的话在JSON中还是可以存在的,任何一个超过Number.MAX_VALUE的数都会被解析成Infinity,我们只要在JSON文本中写入一个巨大的数值字面量就可以在JSON解析后得到Infinity。比如:
JSON.parse("[1E309,-1E309]");
  Infinity的问题确实可以这么解决,但NaN这个值就没法解决了。NaN这个值本身就没有字面量,我们平时用的NaN这个关键词都是一个引用,它可以作为局部变量名被重定义。这就是JSON的一个痛点。
  另一个痛点是无法区分正负零。这可能也不能怪JSON,因为JavaScript本身对这个的区分就不太容易。本来负数被转换成字符串后是会自带负号的,但负零也许不被当做负数处理,所以它转换成字符串不带负号,于是JSON中自然也没有对正负零的处理。

  不过这都是stringify算法的问题,实际上JSON本身是支持负零值的。
JSON.parse("[0,-0]");
  对于以上这些问题,我突然想JavaScript是不是应该给NaN值加一个字面量呢?虽然我平时会用0/0来代替,但这毕竟是一个表达式。如果不能用NaN这个词的话是不是可以考虑从数值字面量的词法上扩展呢?
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^