0

编辑:问题是我在使用 parseInt 时没有指定基数。我想确切地了解为什么会发生这种情况 - 我会奖励任何能告诉我为什么这只会给 Firefox 中的 08 和 09 值造成问题的人的答案!


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

当我通过 jquery 的 ajax 请求这个对象时,JSON 验证 - 它也通过JSONLint没有意外。然后我将其转换为二维 javascript 数组,使用 parseInt 将纯字符串 JSON 键转换为数组的整数键。

这在几乎所有浏览器/平台上都可以正常工作:

原始 JSON:

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

循环输出(Safari/Chrome,OSX):

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

循环输出(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 。我错过了什么?

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

4

1 回答 1

3

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

您正在寻找:

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

为什么?

如果 radix 未定义或为 0,JavaScript 假定如下:

  • 如果输入字符串以“0x”或“0X”开头,则基数为 16(十六进制)。
  • 如果输入字符串以“0”开头,则基数为八(八进制)。这个特性是非标准的,一些实现故意不支持它(而是使用基数 10)。由于这个原因,在使用 parseInt 时总是指定一个基数。
  • 如果输入字符串以任何其他值开头,则基数为 10(十进制)。

parseInt('08') 和 parseInt('09') 都返回零,因为函数试图确定所用数值系统的正确基数。在 Javascript 中,以零开头的数字被认为是八进制,八进制中没有 08 或 09,因此存在问题。

请参阅文档parseInt

   var test = parseInt(value, 10);

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

而且,始终提供第二个参数(基数)给parseInt. 如果没有提供它,它会尝试过于聪明并自动检测它,并可能导致意想不到的结果。

提供10假设您想要一个以 10 为基数的数字。

于 2013-02-16T23:10:45.307 回答