问题描述:
在使用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 键,按照加入时间升序排列。