zoukankan      html  css  js  c++  java
  • 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 (规范地址)
  • 相关阅读:
    CF891E Lust
    Comet OJ 2019 夏季欢乐赛题解
    CF1098E Fedya the Potter
    CF1063F String Journey
    P4218 [CTSC2010]珠宝商
    AGC028 E
    51Nod 1584 加权约数和
    51Nod 1769 Clarke and math2
    Educational Codeforces Round 67
    斯特林数学习笔记
  • 原文地址:https://www.cnblogs.com/walkermag/p/13590697.html
Copyright © 2011-2022 走看看