一尘不染

JavaScript元素按“ for(…in…)”循环排序

javascript

Javascript中的“ for…in”循环是否按声明的顺序遍历哈希表/元素?有没有按顺序执行的浏览器?
我希望使用的对象将被声明 一次, 并且永远不会被修改。

假设我有:

var myObject = { A: "Hello", B: "World" };

我进一步将它们用于:

for (var item in myObject) alert(item + " : " + myObject[item]);

我是否可以期望在大多数体面的浏览器中,“ A:“ Hello””总是排在“ B:“ World””之前?


阅读 775

收藏
2020-04-23

共1个答案

一尘不染

当前,所有主流浏览器都按照定义它们的顺序遍历对象的属性。Chrome可以做到这一点,除了少数情况。[…]
ECMAScript规范明确未定义此行为。在ECMA-262中,第12.6.4节:

枚举属性的机制……取决于实现。

但是,规范与实现完全不同。ECMAScript的所有现代实现都按照定义它们的顺序遍历对象属性。因此,Chrome小组认为这是一个错误,并将予以修复。

除了Chrome和Opera以外,所有浏览器都遵循定义顺序,而Chrome则对每个非数字属性名称都遵循。在这两种浏览器中,属性是按顺序拉到第一个非数字属性之前的(这与它们实现数组的方式有关)。顺序也相同Object.keys

此示例应清楚说明发生了什么:

var obj = {
  "first":"first",
  "2":"2",
  "34":"34",
  "1":"1",
  "second":"second"
};
for (var i in obj) { console.log(i); };
// Order listed:
// "1"
// "2"
// "34"
// "first"
// "second"

它的技术性不如可能随时更改的事实重要。不要依赖保持这种状态的事物。

简而言之:如果顺序对您很重要,请使用数组。

2020-04-23