對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還有如下: