【问题标题】:Why does an object reorder itself automatically? [duplicate]为什么对象会自动重新排序? [复制]
【发布时间】:2013-11-07 15:56:46
【问题描述】:

我创建了一个对象,其中包含点的内容和您将获得的标记

marks: {
                900: 1.0,
                822: 1.1,
                804: 1.2,
                786: 1.3,
                768: 1.4,
                750: 1.5,
                732: 1.6,
                714: 1.7,
                696: 1.8,
                678: 1.9,
                660: 2.0,
                588: 2.4,
                570: 2.5,
                552: 2.6,
                534: 2.7,
                516: 2.8,
                498: 2.9,
                480: 3.0,
                462: 3.1,
                444: 3.2,
                426: 3.3,
                408: 3.4,
                390: 3.5,
                372: 3.6,
                354: 3.7,
                336: 3.8,
                318: 3.9,
                300: 4.0
            },

如果我在控制台中显示对象,输出将是

对象 { 300=4, 318=3.9, 336=3.8, 更多...}

你可以在http://jsfiddle.net/Sx4Z2/上看到它的直播

出了什么问题,为什么对象中有顺序?

【问题讨论】:

  • 我猜它被解释为一个带有数字索引的数组。如果您想阻止排序,请尝试调用元素,例如i318, i300 等(尽管控制台可能总是按名称对其属性进行排序)
  • 为什么是数组?标记 = {} => 对象

标签: javascript


【解决方案1】:

如果顺序对您很重要,您应该使用数组。您不能信任 JavaScript 对象中的属性顺序。在你的情况下,我会使用类似的东西:

[
    {key: 900, value: 1.0},
    {key: 822, value: 1.1},
    // ...
]

看看这个问题:Does JavaScript Guarantee Object Property Order?

【讨论】:

  • 带有数字索引的数组不会以同样的方式排序吗?
  • 编辑了关于您问题的答案。 ;)
  • +1 理由和替代
  • 好的,这很可靠,但我如何才能真正使用密钥 900 访问该属性,而无需每次都遍历整个数组?
  • 我认为不经过它直接访问的唯一方法是创建另一个对象来保存相应的索引。
【解决方案2】:

ECMA-262 没有指定对象中键的顺序。但是请注意以下几点:

  1. 几乎每个 JavaScript 引擎都会保留键顺序。
  2. ...除非这些键是整数,在这种情况下它们通常不会。

因此,在您的情况下,如果您在键前加上一些非字母字符串,您应该能够提供可预测的行为(尽管不基于任何标准)。

【讨论】:

  • 依赖无证行为通常是个坏主意。
  • 这种行为实际上并不是“可预测的”。它可以随任何新版本而改变。 不要依赖它!
  • 我同意这可能是不可取的。然而,几乎所有浏览器供应商都认识到有足够多的“野外”站点依赖于这种行为,因此他们支持它作为一项功能。现在似乎找不到它,但我什至在这里看到了针对 V8 的回归错误,该错误随后被修复。
【解决方案3】:

它本身不是reorder - JavaScript 对象没有指定的顺序。如果需要排序,请使用数组。

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多