For..in...和Object.keys之后的输出顺序


  在做Excel表格读取数据的时候,需要将数据转换为数组,因为不知道for..in ..的遍历会有自动排序的作用,所以代码看得挺蒙的。

   经查资料,for..in..的object类型的输出按如下规律:

  1. 如果是纯数字的话,会按数字排序后按照数字顺序输出;
  2. 包含正数和其他的object的键,会按照正数顺序先排列输出,再输出其他项;
  3. 包含负数,-号识别为字符。

  后面看到了有Object.keys的数据转换,查了一下,这个也会对object进行键排序:

  (参考:https://zhuanlan.zhihu.com/p/40601459,写得很好)

  总结的情况:

  1. 声明变量keys值为一个空列表(List类型)
  2. 把每个Number类型的属性,按数值大小升序排序,并依次添加到keys中
  3. 把每个String类型的属性,按创建时间升序排序,并依次添加到keys中
  4. 把每个Symbol类型的属性,按创建时间升序排序,并依次添加到keys中
  5. 将keys返回(return keys)

   上面这个规则不光规定了不同类型的返回顺序,还规定了如果对象的属性类型是数字,字符与Symbol混合的,那么返回顺序永远是数字在前,然后是字符串,最后是Symbol

   文章举的例子:

Object.keys({
  5: '5',
  a: 'a',
  1: '1',
  c: 'c',
  3: '3',
  b: 'b'
})
// ["1", "3", "5", "a", "c", "b"]

  排序规则同样适用于下列API:

    • Object.entries
    • Object.values
    • for...in循环
    • Object.getOwnPropertyNames
    • Reflect.ownKeys

相关