各浏览器 for-in 遍历对象属性的顺序差异

最近一个项目的开发中,初始化导航菜单的数据,后台给定的数据是 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 语句时,与遵循第五版规范实现的解析引擎,对属性的遍历顺序存在不一致的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值