study / Object.keys是如何排序的?

作者 GaoGe 日期 2021-01-07
ES6
study / Object.keys是如何排序的?

首先介绍这个方法如何使用~

Object.keys() 返回一个由对象属性组成的字符串数组,一个简单的栗子:

let person = {name:"gg", age:24, sex:'female'}
Object.keys(person)

// 输出结果:["name", "age", "sex"]

从结果上来看,Object.keys()for in 是相同的,拿到对象的属性(即’key’)。除了处理对象,也可以处理数组、字符串。


但四重点,最近在开发中使用这个方法遇到了问题~

遍历对象获取的返回值数组,它的顺序与对象本身属性的位置是不一样的!

首先可能会想到的是,对象本身不存在顺序,而数组是有顺序的。但这个字符串数组是按照什么规则来进行排序的呢?

接下来做了以下测试:

let obj = {2:222,1:111,a:"aaa",对象:"对象"}
Object.keys(obj)

// 输出结果:["1", "2", "a", "对象"]

可以看出对于数字属性,是按照大小进行排序的。

let obj = {对象:"对象",a:"aaa",2:222,1:111}
Object.keys(obj)

// 输出结果:["1", "2", "对象", "a"]
let obj = {a:"aaa",对象:"对象",2:222,1:111}
Object.keys(obj)

// 输出结果:["1", "2", "a", "对象"]

字母跟中文似乎只是按照对象中属性定义的自然顺序排序。


有相关文档中介绍:

按照ECMA-262第五版规范,在使用for-in语句遍历对象属性时遵循以下规律:

首先提取所有key的parseFloat值为非负整数的属性,根据数字顺序把属性遍历出来排序,然后再按照定义的顺序遍历剩余的属性。


如果想要获取对象的原始定义顺序,可以使用数组和for循环来进行遍历。先把无序对象搞成有序的数组再输出,可以解决该问题~