EDIT:问题是我在使用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通过parsent,它们就会返回0。18和19以及28和29都能正常通过。这两个键周围没有任何空格、非ascii字符或其他可能导致它们被错误读取的内容。我完全被难住了。
你可以在这里找到我的完整JSON。我错过了什么?
或者,如果有办法我可以完全解决这个问题,我愿意考虑。谢谢你的帮助,这让我发疯了!
以0
开头的字符串的基数可以是八进制(当没有指定基数时,具体取决于浏览器)。
您正在寻找:
parseInt("09", 10);// parseInt("09")=0
parseInt("08", 10);// parseInt("08")=0
为什么
如果基数未定义或为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的数字。