JavaScript JSON数组数字不一致

时间:2014-04-25 02:32:21

标签: javascript arrays json

我有JSON,其中包含每个键的数组。大多数情况下,当我访问带前导零的数字时,它会将数字作为整数返回。 (这是我的期望。)

当我尝试访问号码0400到0577(含)时,它返回一个似乎相对于256的数字。

任何人都可以帮助我理解为什么会出现这种数字?

var priceList = {
    "1":['Product 1',0400, 1375,0200],
    "2":['Product 2',0425, 0599,0200],
    "3":['Product 3',0399, 0579,0200] }

alert(priceList[1][1]);   // I expect it to alert 400 -- Actual Alert: 256
alert(priceList[2][1]);   // I expect it to alert 420 -- Actual alert: 277
alert(priceList[3][1]);   // I expect it to alert 399 -- Actual alert: 399

4 个答案:

答案 0 :(得分:1)

在javascript中,具有前导零的数字在您使用它们的方式中使用时不被认为是正确的。 有不同类型的数字,例如二进制,十进制,八进制和十六进制。

JavaScript认为前导零表示八进制整数,因此它会尝试将它们转换为八进制数。

如果你把:

"1":['Product 1',Number("0400"), 1375,0200] 

它将按预期输出400

答案 1 :(得分:0)

我认为最好先将它转换为字符串。请参阅下文。这对我有用

var priceList = {
"1":['Product 1','0400', 1375,0200],
"2":['Product 2','0425', 0599,0200],
"3":['Product 3','0399', 0579,0200] }

答案 2 :(得分:0)

那不是JSON。这只是JavaScript中对象文字中数组文字中的数字文字。 JSON is a data interchange format恰好基于JavaScript的语法。

JavaScript数字文字可以是:

  • 小数,即1234.5678
  • 整数,即123456789
  • 科学记数法,即1234e5678
  • 十六进制,即0xABC123
  • 八进制,即0765

所以你看到的问题是以前导零开头的数字被解析为八进制。

答案 3 :(得分:0)

假设您实际上是指JSON而不仅仅是JavaScript对象文字语法,那么您拥有的不是合法的JSON,因为它包含JSON中不允许的数字中的前导0。对于合法的JSON,请考虑,

{ 
    "1": ["Product 1", 400, 1375, 200], 
    "2": ["Product 2", 425, 599, 200], 
    "3": ["Product 3", 399, 579, 200] 
}

请记住,JSON是JavaScript对象文字语法的一个子集。

如果你真的只是指对象文字语法,而不是具体的JSON,数字文字中的前导0被JavaScript解释为八进制数,而不是你想象的十进制数。 JSON禁止前导0的原因之一是禁止JSON数据中的八进制编码,以避免这种混淆。