Heim  >  Fragen und Antworten  >  Hauptteil

Garantiert JavaScript die Reihenfolge der Objekteigenschaften?

<p>Wenn ich ein Objekt wie dieses erstelle: </p> <pre class="brush:php;toolbar:false;">var obj = {}; obj.prop1 = "Foo"; obj.prop2 = "Bar";</pre> <p>Wird das generierte Objekt immer so aussehen? </p> <pre class="brush:php;toolbar:false;">{ prop1 : "Foo", prop2 : "Bar" }</pre> <p>Das heißt, werden die Eigenschaften in der gleichen Reihenfolge sein, in der ich sie hinzugefügt habe? </p>
P粉604848588P粉604848588427 Tage vor462

Antworte allen(2)Ich werde antworten

  • P粉894008490

    P粉8940084902023-08-21 15:38:37

    是的(但不总是按照插入顺序)。

    大多数浏览器迭代对象属性的顺序如下:

    1. 正整数键按升序排列(以及像“1”这样解析为整数的字符串)
    2. 字符串键按插入顺序排列(ES2015保证了这一点,所有浏览器都遵守)
    3. 符号名称按插入顺序排列(ES2015保证了这一点,所有浏览器都遵守)

    一些旧版浏览器将类别1和类别2结合起来,按插入顺序迭代所有键。如果您的键可能解析为整数,最好不要依赖于任何特定的迭代顺序。

    当前语言规范(自ES2015起)保留了插入顺序,但对于解析为正整数的键(例如“7”或“99”)的行为在不同浏览器之间有所不同。例如,Chrome/V8在键解析为数字时不遵守插入顺序。

    旧语言规范(ES2015之前):迭代顺序在技术上是未定义的,但所有主要浏览器都遵守了ES2015的行为。

    请注意,ES2015的行为是语言规范受现有行为驱动的一个很好的例子,而不是相反。要更深入地了解这种向后兼容的思维方式,请参阅http://code.google.com/p/v8/issues/detail?id=164,这是一个详细介绍Chrome迭代顺序行为设计决策的Chrome错误报告。 根据该错误报告中的一个(相当主观)评论:

    Antwort
    0
  • P粉574695215

    P粉5746952152023-08-21 10:41:13

    对象的迭代顺序自ES2015起遵循一定的规则,但它不总是遵循插入顺序。简单来说,迭代顺序是字符串键的插入顺序和类似数字的键的升序的组合:

    // 键的顺序:1, foo, bar
    const obj = { "foo": "foo", "1": "1", "bar": "bar" }

    使用数组或Map对象可以更好地实现这一点。 MapObject有一些相似之处,并且保证按插入顺序迭代键,没有例外:

    需要注意的是,在ES2015之前,对象中的属性顺序根本没有保证。来自ECMAScript第三版(pdf)的对象定义:

    Antwort
    0
  • StornierenAntwort