JavaScript - parseInt在不同的浏览器中不一致

时间:2013-02-16 23:08:50

标签: javascript json multidimensional-array

编辑:问题是当我使用parseInt时我没有指定基数。我想明白为什么会发生这种情况 - 我会给那些能告诉我为什么这只会给firefox中的值08和09带来问题的人奖励答案!


我有一个二维的整数数组,存储为MySQL数据库中的JSON对象。

当我通过jquery的ajax请求这个对象时,JSON会验证 - 它也会毫无意外地通过JSONLint。然后我将它翻译成一个二维javascript数组,使用parseInt将仅字符串的JSON键转换为数组的整数键。

这几乎适用于所有浏览器/平台:

原创JSON:

....
"07": [0, 1...
"08": [0, 1...
"09": [1, 1...
"10": [1, 0...
....

For-loop输出(Safari / Chrome,OSX):

JSON Key (parseInt value): [array]
....
07 (7): [0, 1...
08 (8): [0, 1...
09 (9): [1, 1...
10 (10): [1, 0...
....

For-loop输出(Firefox OSX,iOS):

JSON Key (parseInt value): [array]
....
07 (7): [0, 1...
08 (0): [0, 1...
09 (0): [1, 1...
10 (10): [1, 0...
....

......到底是什么?这些键(8和9)是唯一没有通过parseInt正确传递的键,它发生得非常一致。我已经验证了JSON阵列完整且未经修改地进入所有浏览器 - 密钥保持在08和09这一事实证明了这一点。然而,一旦08和09通过parseint,它们就会返回0. 18和19正确传递,28和29也是如此。没有杂散空格,非ascii字符或这两个键可能导致它们的任何其他内容被不正确地阅读。我完全难过了。

您可以找到我的完整JSON here。我错过了什么?

或者,如果有一种方法我可以完全围绕这一点,我愿意考虑它。谢谢你的帮助,这让我疯了!

1 个答案:

答案 0 :(得分:3)

0开头的字符串的基数可以是八进制(未指定基数时 - 取决于浏览器)。

您正在寻找:

parseInt("09", 10);// parseInt("09")=0
parseInt("08", 10);// parseInt("08")=0

<强> WHY吗

如果radix未定义或为0,则JavaScript假定以下内容:

  
      
  • 如果输入字符串以&#34; 0x&#34开头;或&#34; 0X&#34;,基数为16(十六进制)。
  •   
  • 如果输入字符串以&#34; 0&#34;开头,则基数为8(八进制)。此功能是非标准的,有些实现故意不支持它(而是使用基数10)。因此,在使用parseInt时始终指定基数。
  •   
  • 如果输入字符串以任何其他值开头,则基数为10(十进制)。
  •   

parseInt(&#39; 08&#39;)和parseInt(&#39; 09&#39;)都返回零,因为该函数试图确定所用数字系统的正确基数。在Javascript中,从零开始的数字被认为是八进制,并且八进制中没有08或09,因此存在问题。

请参阅parseInt的文档:

   var test = parseInt(value, 10);

您必须告诉它您想要定位的value输入。

而且,始终向parseInt提供第二个参数(基数)。它试图过于聪明并且如果没有提供则自动检测它并且可能导致意外的结果。

提供10假设您需要基数为10的数字。