首先介绍这个方法如何使用~
Object.keys() 返回一个由对象属性组成的字符串数组,一个简单的栗子:
let person = {name:"gg", age:24, sex:'female'} |
从结果上来看,Object.keys() 与 for in 是相同的,拿到对象的属性(即’key’)。除了处理对象,也可以处理数组、字符串。
但四重点,最近在开发中使用这个方法遇到了问题~
遍历对象获取的返回值数组,它的顺序与对象本身属性的位置是不一样的!
首先可能会想到的是,对象本身不存在顺序,而数组是有顺序的。但这个字符串数组是按照什么规则来进行排序的呢?
接下来做了以下测试:
let obj = {2:222,1:111,a:"aaa",对象:"对象"} |
可以看出对于数字属性,是按照大小进行排序的。
let obj = {对象:"对象",a:"aaa",2:222,1:111} |
let obj = {a:"aaa",对象:"对象",2:222,1:111} |
字母跟中文似乎只是按照对象中属性定义的自然顺序排序。
有相关文档中介绍:
按照ECMA-262第五版规范,在使用for-in语句遍历对象属性时遵循以下规律:
首先提取所有key的parseFloat值为非负整数的属性,根据数字顺序把属性遍历出来排序,然后再按照定义的顺序遍历剩余的属性。
如果想要获取对象的原始定义顺序,可以使用数组和for循环来进行遍历。先把无序对象搞成有序的数组再输出,可以解决该问题~