各浏览器 forin 遍历对象属性的顺序差异

最近一个项目的开发中,初始化导航菜单的数据,后台给定的数据是 JavaScript 对象,其键是菜单的 id (数字),值是菜单对象。数据如下:

1
2
3
4
5
6
7
8
9
10
11
12
var menuList = {
    '26':{'name':'新闻','model':'list'},
    '23':{'name':'娱乐','model':'list'},
    '25':{'name':'体育','model':'list'},
    '21':{'name':'读书','model':'list'},
    '24':{'name':'时尚','model':'list'},
    '22':{'name':'女性','model':'list'}
};
var info = document.getElementById('info');
for (menu in menuList) {
    info.innerHTML += menu + " : " + menuList[menu]['name'] + "<br/>";
}

在 IE6、IE7、IE8、Firefox、Safari(包括 iPhone)中,遍历得到的结果,和给定的一致:

1
2
3
4
5
6
26 : 新闻
23 : 娱乐
25 : 体育
21 : 读书
24 : 时尚
22 : 女性

而在 IE9、Chrome、Opera、Android  中,输出的顺序则是:

1
2
3
4
5
6
21 : 读书
22 : 女性
23 : 娱乐
24 : 时尚
25 : 体育
26 : 新闻

参考此文得知原因如下:

  1. 根据 ECMA-262(ECMAScript)第三版中描述,for-in 语句的属性遍历的顺序是由对象定义时属性的书写顺序决定的。
  2. 在现有最新的 ECMA-262(ECMAScript)第五版规范中,对 for-in 语句的遍历机制又做了调整,属性遍历的顺序是没有被规定的。
  3. 新版本中的属性遍历顺序说明与早期版本不同,这将导致遵循 ECMA-262 第三版规范内容实现的 JavaScript 解析引擎(如IE6 IE7 IE8 Firefox Safari 浏览器的 JavaScript 解析引擎,它们完成时间早于 ECMA-262 第五版规范发布时间)在处理 for-in 语句时,与遵循第五版规范实现的解析引擎,对属性的遍历顺序存在不一致的问题。
原文地址:https://www.cnblogs.com/shihao/p/2312035.html