Object.keys()---无序?

1,258 阅读1分钟

问题描述:

在使用Object.keys()方法获取对象的键时,所得到的键值数组并不是按照对象中定义的键值对顺序排列。

测试:

var origin_obj = {'1':'a','2','b','3':'c','四':'d','a':'e'};
var origin_keys = Object.keys(origin_obj);
--- 
//result:
["1", "2", "3", "四", "a"]

var origin_obj = {'1':'a','四':'d','a':'e','2':'b','3':'c'};
var origin_keys = Object.keys(origin_obj);
---
//result:
["1", "2", "3", "四", "a"]


var origin_obj = {'a':'e','2':'b','1':'a','四':'d','3':'c'};
var origin_keys = Object.keys(origin_obj);
---
["1", "2", "3", "a", "四"]

var origin_obj = {'a':'e','2':'b','1':'a','四':'d','-4':'负数3','-2':'负数','-1':'负数2','3':'c'};
var origin_keys = Object.keys(origin_obj);
---
["1", "2", "3", "a", "四", "-4", "-2", "-1"]
综上
  • 前:parseFloat(key)非负整数按照升序遍历
  • 后:然后按照对象定义的顺序遍历余下的所有属性(包括小数、中文、字母...)

经测试,Chrome、IE9及其以上版本按照上述结果遍历,FireFox未测试

解析

ES6属性排序规范
  • 首先遍历所有数值键,按照数值升序排列。--- 数值只对非负整数
  • 其次遍历所有字符串键,按照加入时间升序排列。
  • 最后遍历所有 Symbol 键,按照加入时间升序排列。