json对象遍历顺序问题
对json对象遍历我们一般使用for in循环,或者Object.keys + 数组方法。在接触js以来听到过一种说法:
for in 遍历顺序是不可靠的
但是在实际开发中for in 循环也是按照其键值对的排列先后被遍历,直到遇见了下面的数据:
const data = {
"11": 11,
"2": 2,
"9": 9,
"1": 1
}
var dsd = JSON.stringify(a)
console.log(a); // { '1': 1, '2': 2, '9': 9, '11': 11 }
var keys = Object.keys(a)
console.log(keys); // [ '1', '2', '9', '11' ]
for(var i in a){
console.log(i); 1 2 9 11
}
遍历的时候按照数字从小到大排序了,为什么不能按照给定的顺序输出呢?
在文章5分钟彻底理解Object.keys中作者通过查阅ECMAscript规范,最后提供了如下的结论:
Object.keys
在内部会根据属性名key
的类型进行不同的排序逻辑。分三种情况:
- 如果属性名的类型是
Number
,那么Object.keys
返回值是按照key
从小到大排序 - 如果属性名的类型是
String
,那么Object.keys
返回值是按照属性被创建的时间升序排序。 - 如果属性名的类型是
Symbol
,那么逻辑同String
相同 - 如果属性名的类型是多种类型,那么Number总是排在前面。
也就是说在使用到数字型的key的时候,需要特别注意,遍历出来的顺序和想要的可能会不一致
自己也查看了下for in 部分的规范,其中问题出现在 object.[[OwnPropertyKeys]]
,该方法规范地址在这儿,其中就是定义了上面的结论。
直接或者间接使用 object.[[OwnPropertyKeys]]
的 API还有如下: