> Есть ли вероятность, что количество ключей, полученных через for-in и Object.keys, будет разным для одного объекта и при каком условии (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: Kaspersky

Стек: JavaScript

> Пример ответа

Короткий ответ

Да, вероятность есть. for-in перечисляет собственные и унаследованные перечисляемые свойства, а Object.keys - только собственные перечисляемые. Разница появится, если у объекта есть перечисляемые свойства в цепочке прототипов. Также порядок может отличаться для целочисленных ключей, но количество совпадёт, если не учитывать унаследованные.

Подробное объяснение

for-in проходит по всей цепочке прототипов, включая свойства, добавленные через Object.prototype или другие прототипы. Object.keys возвращает только собственные enumerable-свойства объекта.

Условия расхождения:

  • наличие перечисляемых свойств у прототипа объекта;
  • если свойство добавлено через Object.defineProperty с enumerable: true в прототип;
  • если используется Object.create с объектом-прототипом, содержащим перечисляемые свойства.

Также for-in может включать свойства, добавленные в Object.prototype (например, через полифил), если они перечисляемые. Object.keys такие свойства не вернёт.

Порядок обхода для целочисленных ключей в for-in и Object.keys одинаков, но это не влияет на количество.

На практике

В реальном коде расхождение чаще всего возникает при работе с наследованием или при использовании библиотек, расширяющих прототипы. Для безопасного перебора собственных свойств всегда предпочтительнее Object.keys или Object.entries.

Если нужно учесть и унаследованные свойства, используйте for-in с проверкой hasOwnProperty.

Пример кода

JAVASCRIPT
const proto = { inherited: true };
const obj = Object.create(proto);
obj.own = 1;
console.log(Object.keys(obj)); // ['own']
const forInKeys = [];
for (const key in obj) {
forInKeys.push(key);
}
console.log(forInKeys); // ['own', 'inherited']

Как отвечать на собеседовании

Начните с чёткого различия: for-in включает унаследованные свойства, Object.keys - нет. Приведите пример с Object.create. Упомяните, что for-in не гарантирует порядок для нецелочисленных ключей, но это не влияет на количество. Подчеркните, что на практике лучше использовать Object.keys для собственных свойств.

Что проверяет интервьюер

Понимание разницы между собственными и унаследованными свойствами, знание цепочки прототипов, осознание побочных эффектов расширения прототипов. Также проверяется умение объяснить поведение стандартных методов без заучивания.

Типичные ошибки

  • утверждение, что for-in и Object.keys всегда возвращают одинаковое количество ключей;
  • игнорирование влияния Object.prototype на for-in;
  • забывают, что Object.keys не включает неенумерабельные свойства, но это верно и для for-in;
  • путают for-in с for-of.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью