我有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
答案 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数据中的八进制编码,以避免这种混淆。