> Есть ли вероятность, что количество ключей, полученных через 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.
Пример кода
JAVASCRIPTconst 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.
> Похожие задачи по frontend
Сколько раз выполнится console.log в цикле с использованием оператора остатка от деления в JavaScript?
Что такое автобоксинг в JavaScript и почему можно обращаться к методам строки через точку
Какая конструкция может использоваться вместе с try-catch в JavaScript
Как перехватить исключение в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью