大家在遍历对象时经常会用到Object.keys()这个方法,但是有时候遍历出来的keys会排序,而有时候却按照对象中的顺序来出现,先看下面两个例子:
// 例子1
const obj = { 100: '一百', 2: '二', 7: '七' } Object.keys(obj) // ["2", "7", "100"]
// 例子2 const obj = { c: 'c', a: 'a', b: 'b' } Object.keys(obj) // ["c", "a", "b"]
这时就会发现两个例子的区别,例子1中的key会排序,例子2中则原样输出,这是为什么呢?
答案:
对于上面那个问题先给出结论,Object.keys
在内部会根据属性名key
的类型进行不同的排序逻辑。分三种情况:
- 如果属性名的类型是
Number
,那么Object.keys
返回值是按照key
从小到大排序 - 如果属性名的类型是
String
,那么Object.keys
返回值是按照属性被创建的时间升序排序。 - 如果属性名的类型是
Symbol
,那么逻辑同String
相同
这就解释了上面的问题。