【问题标题】:Javascript: order of "for" cycle through object props [duplicate]Javascript:“for”循环对象道具的顺序[重复]
【发布时间】:2013-03-07 21:49:07
【问题描述】:

如果我有一个对象,通过它的属性循环:

var obj = {a: 1, b: 2, c: 3}

for (var prop in obj){
   console.log(obj[prop])
}

我是否会不可避免地得到:1、2、3 的结果?它可能取决于什么?其他结果实际上是真实的吗?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    不,语言中不保证对象属性的迭代顺序。

    来自the MDN

    for...in 循环遍历一个对象的属性 任意顺序(有关为什么不能 取决于迭代的表面顺序,至少在一个 跨浏览器设置)

    虽然 ECMAScript 使对象的迭代顺序 依赖于实现,似乎所有主流浏览器 支持基于最早添加的属性的迭代顺序 首先(至少对于不在原型上的属性)。然而,在 以 Internet Explorer 为例,当对属性使用 delete 时,一些 混淆行为结果,阻止其他浏览器使用 像对象文字这样的简单对象作为有序关联数组。在 资源管理器,而属性值确实设置为未定义,如果为 稍后添加一个具有相同名称的属性,该属性将是 在它的旧位置迭代——而不是在迭代序列的末尾 正如人们在删除属性然后添加后所期望的那样 它回来了。

    所以如果你想模拟一个有序的关联数组 跨浏览器环境,你不得不使用两个独立的 数组(一个用于键,另一个用于值),或构建一个 单一属性对象的数组等。

    如果你想要一个保证,你必须使用一个数组。如果您愿意,可以通过对属性键进行排序来构造它。

    【讨论】:

    • 我从来没有在这样的循环中遇到过错误的顺序,并且做了测试,但它总是 1,2, 3 =)
    • 它基本上取决于实现。由于没有认真的开发人员依赖最常见的行为,因此很可能会出现不同的实现。
    • 好的,谢谢你的回复-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2014-05-29
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多