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

假设我有:

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

我进一步将它们用于:

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

在大多数像样的浏览器中,“A:“Hello”总是出现在“B:“World”之前吗?


当前回答

订单不可信。Opera和Chrome都返回无序的属性列表。

<script type="text/javascript">
var username = {"14719":"A","648":"B","15185":"C"};

for (var i in username) {
  window.alert(i + ' => ' + username[i]);
}
</script>

上面的代码显示了Opera中的B, A, C和Chrome中的C, A, B。

其他回答

在IE6中,不保证顺序。

对象中for/in枚举的元素是没有设置DontEnum标志的属性。ECMAScript,又名Javascript,标准明确指出“对象是属性的无序集合”(参见http://www.mozilla.org/js/language/E262-3.pdf节8.6)。

假设所有Javascript实现都按照声明顺序枚举是不符合标准的(即不安全)。

来自ECMAScript语言规范,第12.6.4节(关于..在循环):

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

第4.3.3节(“对象”的定义):

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

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

如果你想定义你的订单,你需要实现一些定义它的东西,比如你在访问对象之前排序的键数组。

这并没有回答问题本身,但为基本问题提供了一个解决方案。

假设您不能依赖顺序来保存,为什么不使用具有键和值的对象数组作为属性呢?

var myArray = [
    {
        'key'   : 'key1'
        'value' : 0
    },
    {
        'key'   : 'key2',
        'value' : 1
    } // ...
];

现在,由您来确保键是唯一的(假设这对您也很重要)。同样,直接寻址也发生了变化,for(…in…)现在将索引作为“键”返回。

> console.log(myArray[0].key);
key1

> for (let index in myArray) {console.log(myArray[index].value);}
0
1
See the Pen

为(…in…)编址

by JDQ (

@JDQ

) on

CodePen

.

截至2022年,

我刚刚发现(出乎我的意料),Chrome浏览器不尊重定义顺序。它只是按字母顺序排列,而不是自然排列。例如,键“a12”在“a3”之前。所以要小心。