Это меньше о том, как object.keys работает и больше о том, как представлены свойства объекта. В V8 существуют свойства объекта (такое же представление, как поля C struct или поля объектов Java), фиксированные свойства вне объекта, хранящиеся в фиксированном массиве, и динамические свойства вне объекта, хранящиеся в хеш-таблице.
Макет свойств объекта и фиксированных свойств вне объекта хранится отдельно в скрытом классе объекта. Если изменяется макет объекта, он получает новый скрытый класс. Подобно Java's Class object, скрытый объект класса содержит имена фиксированных свойств, и вы просто перебираете этот массив.
При использовании представления хеш-таблицы (aka dictionary, hashmap или normalized object) вы должны динамически перебирать ключи хеш-таблицы так же, как вы перебираете любую хеш-таблицу.
Что вы подразумеваете под «как»? Вы спрашиваете о заказе? Я бы подумал, что «как» будет полностью зависимой от реализации и не очень полезной информацией в программе JS. –
Я не имею в виду порядок, я имею в виду, как это делается. И полезно ли это знать или нет, это личное мнение: давайте придерживаться этого вопроса. – Pensierinmusica
Вы имеете в виду реализацию каждого браузера и как они будут интерпретировать код javascript или вы хотите что-то вроде спецификации ECMA? Что-то вроде этого? http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.prototype.foreach – DuKes0mE