Skip to content

for...in遍历对象时的顺序问题 #20

@ScoutYin

Description

@ScoutYin

首先,for...in循环的确是有顺序的。

那么当它遍历一个对象时,顺序和优先级如下:

  • 优先按照升序规则遍历key为整数属性的属性
  • 其次遍历key为 Symbol 类型的属性
  • 再其次按照属性创建时间升序遍历

整个过程可以理解为:首先创建一个名为 keys 的空数组,然后先遍历对象中的数组索引的属性,结果以升序排列,并逐个放入 keys 中;再遍历字符串属性(但不是数组索引),以属性创建时间升序排列,并逐个放入 keys 中去;然后再遍历 Symbol 类型的属性名,同样以属性创建时间升序排列,放入 keys 中,最后返回 keys 数组

所以当我们对遍历结果顺序有要求的情况下,最好不要使用for...in来遍历对象,遍历数组也不推荐(因为会枚举所有可枚举的属性,不一定只有数组的每一项)

按照MDN官方的说法:

for ... in是为遍历对象属性而构建的,不建议与数组一起使用,数组可以用Array.prototype.forEach()和for ... of,那么for ... in的到底有什么用呢?它最常用的地方应该是用于调试,可以更方便的去检查对象属性(通过输出到控制台或其他方式)。尽管对于处理存储数据,数组更实用些,但是你在处理有key-value数据(比如属性用作“键”),需要检查其中的任何键是否为某值的情况时,还是推荐用for ... in。

参考链接
JavaScript for...in 循环出来的对象属性顺序到底是什么规律?
如何按原顺序打印出对象的属性?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions