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

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

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

假设我有:

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

我进一步将它们用于:

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

我能期待‘A:’你好‘总是出现在’B:‘世界’之前,在大多数体面的浏览器?


繁星点点滴滴
浏览 329回答 4
4回答

翻翻过去那场雪

引用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"这方面的技术细节不如在任何时候都可能发生变化这一事实重要。不要指望事情继续这样下去。简言之:如果订单对您很重要,请使用数组。

largeQ

从ECMAScript语言规范,第12.6.4条(关于for .. in(循环):枚举属性的机制依赖于实现。枚举的顺序由对象定义。第4.3.3节(“物体”的定义):它是一个无序的属性集合,每个属性都包含一个原始值、对象或函数。存储在对象属性中的函数称为方法。我猜这意味着您不能依赖在JavaScript实现中以一致顺序枚举的属性。(依赖于特定于实现的语言细节将是糟糕的风格。)如果您想要定义您的订单,您将需要实现一些定义它的东西,比如在使用它访问对象之前对其进行排序的一个键数组。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript