4 мар. 2014 г.

Порядок перечисления в for-in и Object.keys()

ECMAScript Language Specification Edition 3 (ECMA-262-3):

  • 4.3.3 Object
    An object is a member of the type Object. It is an unordered collection of properties each of which contains a primitive value, object, or function.
  • 12.6.4 The for-in Statement
    The mechanics of enumerating the properties (get the name of the next property ... that doesn't have the DontEnum attribute) is implementation dependent.
ECMAScript Language Specification Edition 5.1 (ECMA-262-5.1):
  • 8.6 The Object Type
    An Object is a collection of properties.
  • 12.6.4 The for-in Statement
    The mechanics and order of enumerating the properties (let P be the name of the next property of obj whose [[Enumerable]] attribute is true) is not specified.
  • 15.2.3.14 Object.keys ( O )
    If an implementation defines a specific order of enumeration for the for-in statement, that same enumeration order must be used in step 5 of this algorithm.
Как видим, порядок перечисления свойств объекта не указан. Теоретически он может быть случайным даже при повторном перечислении свойств одного и того же объекта, однако на практике каждый проверенный интерпретатор JavaScript использует свой определённый порядок: jsfiddle
  • Chrome 21, Chrome 33, Firefox 27, Opera 12: первыми перечисляются свойства с именем в виде целого числа (a property name that can be parsed as a 32-bit unsigned integer), отсортированные по возрастанию, затем все остальные в порядке инициализации в коде (см. баг в V8); удаление и последующее добавление свойства изменяет его порядок следования
  • Firefox 27: порядок совпадает с Chrome
  • Firefox 14: в порядке инициализации в коде
  • IE9, IE10: сначала свойства с целочисленными именами, затем остальные в порядке упоминания в коде; удаление и последующее добавление свойства НЕ изменяет его порядок следования
  • Konqueror 4.10.2: в порядке инициализации в коде

Комментариев нет:

Отправить комментарий