【技术博客】Object.keys返回的元素顺序可靠吗
发布于 6 年前 作者 zhanzhenzhen 10051 次浏览 来自 分享

原文在我的博客: 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返回的元素顺序。现在我的代码里,如果有这种需求,我都是建一个对象,再建一个数组,用数组储存顺序。

7 回复

object key 是离散的,无须的,js里只有 array里的元素顺序是固定的。

@stonephp Object.keys有序还是有序的,只不过这个顺序的规律有些复杂罢了。

已修改了部分正文。

O(∩_∩)O哈哈~

@zhanzhenzhen 什么样的复杂规律?

@polunzh 我正文里说了呀

这个就类似for in循环遍历。chrome上可能是一个结果,其他可能是另一个结果

回到顶部