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的類型進行不同的排序邏輯。分三種情況:

  1. 如果屬性名的類型是Number,那么Object.keys返回值是按照key從小到大排序
  2. 如果屬性名的類型是String,那么Object.keys返回值是按照屬性被創建的時間升序排序。
  3. 如果屬性名的類型是Symbol,那么邏輯同String相同
  4. 如果屬性名的類型是多種類型,那么Number總是排在前面。

也就是說在使用到數字型的key的時候,需要特別注意,遍歷出來的順序和想要的可能會不一致

自己也查看了下for in 部分的規范,其中問題出現在 object.[[OwnPropertyKeys]] ,該方法規范地址在這兒,其中就是定義了上面的結論。

直接或者間接使用 object.[[OwnPropertyKeys]]的 API還有如下:

  1. Object.entries 規范地址
  2. Object.values 規范地址
  3. Object.getOwnPropertyNames 規范地址
  4. Reflect.ownKeys 規范地址
  5. Object.keys (規范地址)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM