55utah / markdown_blogs

markdown 博客

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Object.keys 返回属性名排序问题

55utah opened this issue · comments

结论

1. 属性名如果是数字,按从小到大排序输出;如果是字符串或者symbol类型,按属性创建时间先后排序;
2. 如果是数字、字符串、symbol混合,则先输出数字,再字符串,最后symbol

上面规则也适用于以下API

1. Object.entries
2. Object.values
3. for...in循环
4. Object.getOwnPropertyNames
5. Reflect.ownKeys

以上API除了Reflect.ownKeys之外,其他API均会将Symbol类型的属性过滤掉。

例子

Object.keys({
    4: '12',
    'b': 'b-v',
    2: '11',
    'a': 'a-v',
    0: '222',
    'c': 'c-v',
})
// ["0", "2", "4", "b", "a", "c"]

// 可以看到数字属性名被转字符串并按规则组织顺序。

再测试Object.values
Object.values({
    4: '12',
    'b': 'b-v',
    2: '11',
    'a': 'a-v',
    0: '222',
    'c': 'c-v',
})
//  ["222", "11", "12", "b-v", "a-v", "c-v"]