原文在我的博客: https://zhanzhenzhen.github.io/2016_12_11
Object.keys返回的元素顺序可靠吗
Object.keys(obj)
返回的是一个数组。一般情况下,元素总是按属性赋值时的顺序(而不是按照名称顺序)排序的。例如:
var obj = {};
obj.a = true;
obj.b = true;
Object.keys(obj)
返回的是["a", "b"]
。
而对于这个:
var obj = {};
obj.b = true;
obj.a = true;
Object.keys(obj)
返回的是["b", "a"]
。
你可能会利用这个特性,让程序依赖这个顺序。例如,有时要用对象实现“字典(dictionary)”的结构,这样查询速度快,但同时又想要程序记住每个key赋值的顺序。用Object.keys
真是完美。我也这样做了,直到有一天……
我突然发现竟然有例外的情况。当某个key只含有数字字符(不以0
开头),且值小于4294967296时,它总是以数字大小的顺序排序。例如:
var obj = {};
obj["56"] = true;
obj["34"] = true;
Object.keys(obj)
返回的是["34", "56"]
而不是["56", "34"]
。
所以现在我认为,应避免依赖Object.keys
返回的元素顺序。现在我的代码里,如果有这种需求,我都是建一个对象,再建一个数组,用数组储存顺序。