-
Notifications
You must be signed in to change notification settings - Fork 3
Open
Labels
JavaScript 基础About JavaScriptAbout JavaScript
Description
首先,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
Labels
JavaScript 基础About JavaScriptAbout JavaScript