为了账号安全,请及时绑定邮箱和手机立即绑定

元素在“for”中的顺序(…)在…中)“环路

元素在“for”中的顺序(…)在…中)“环路

繁星点点滴滴 2019-06-03 13:40:10
元素在“for”中的顺序(…)在…中)“环路Javascript循环中的“for…in”循环是否按照声明的顺序通过哈希表/元素?是否有一个不按顺序执行的浏览器?我希望使用的对象将被声明。一次永远不会被修改。假设我有:var myObject = { A: "Hello", B: "World" };我进一步将它们用于:for (var item in myObject) alert(item + " : " + myObject[item]);我能期待‘A:’你好‘总是出现在’B:‘世界’之前,在大多数体面的浏览器?
查看完整描述

4 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

引用John Resig的话:

当前,所有主要浏览器都按照定义对象的顺序遍历对象的属性。Chrome也能做到这一点,除了几个案例。[.]ECMAScript规范未显式地保留此行为。在ECMA-262,第12.6.4节:

列举这些特性的机制.。是依赖于实现的。

然而,规范与实现非常不同。ECMAScript的所有现代实现都按照定义对象属性的顺序迭代对象属性。因此,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"

这方面的技术细节不如在任何时候都可能发生变化这一事实重要。不要指望事情继续这样下去。

简言之:如果订单对您很重要,请使用数组。


查看完整回答
反对 回复 2019-06-03
?
largeQ

TA贡献2039条经验 获得超7个赞

ECMAScript语言规范,第12.6.4条(关于for .. in(循环):

枚举属性的机制依赖于实现。枚举的顺序由对象定义。

第4.3.3节(“物体”的定义):

它是一个无序的属性集合,每个属性都包含一个原始值、对象或函数。存储在对象属性中的函数称为方法。

我猜这意味着您不能依赖在JavaScript实现中以一致顺序枚举的属性。(依赖于特定于实现的语言细节将是糟糕的风格。)

如果您想要定义您的订单,您将需要实现一些定义它的东西,比如在使用它访问对象之前对其进行排序的一个键数组。


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 328 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信