NO --- 25 Object.keys()

大家在遍历对象时经常会用到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的类型进行不同的排序逻辑。分三种情况:

  1. 如果属性名的类型是Number,那么Object.keys返回值是按照key从小到大排序
  2. 如果属性名的类型是String,那么Object.keys返回值是按照属性被创建的时间升序排序。
  3. 如果属性名的类型是Symbol,那么逻辑同String相同

这就解释了上面的问题。

具体原因可以参考:https://github.com/berwin/Blog/issues/24