> Как в цикле for-in в JavaScript вывести только собственные ключи объекта без ключей прототипа (JavaScript)
Уровень: middle · Роль: frontend · Категория: Технические вопросы
Компании: Kaspersky
Стек: JavaScript
> Пример ответа
Короткий ответ
Для вывода только собственных ключей объекта в цикле for-in используйте метод hasOwnProperty(). Внутри цикла проверяйте каждое свойство: if (obj.hasOwnProperty(key)). Альтернатива - использовать Object.keys(), который возвращает только собственные перечисляемые ключи, и затем итерироваться по полученному массиву.
Подробное объяснение
Цикл for-in в JavaScript перебирает все перечисляемые свойства объекта, включая унаследованные через цепочку прототипов. Это может привести к неожиданным результатам, если объект имеет прототип с дополнительными свойствами. Метод hasOwnProperty() - это стандартный способ отфильтровать только собственные ключи. Он возвращает true, если свойство принадлежит непосредственно объекту, а не его прототипу. Альтернативный подход - использовать Object.keys(), который возвращает массив собственных перечисляемых ключей, и затем итерироваться по нему с помощью forEach или for-of. Это более современный и безопасный способ, так как он исключает риск случайного перебора прототипных свойств.
На практике
На собеседовании важно показать понимание разницы между собственными и унаследованными свойствами. Используйте hasOwnProperty() в цикле for-in для явной фильтрации. Для продакшена предпочтительнее Object.keys(), так как он чище и не требует дополнительной проверки. Если нужно сохранить совместимость с очень старыми окружениями, hasOwnProperty остаётся надёжным вариантом. Всегда проверяйте, не переопределён ли hasOwnProperty в самом объекте - для безопасности вызывайте его через Object.prototype.hasOwnProperty.call(obj, key).
Пример кода
JAVASCRIPTconst parent = { inherited: 'value' };const child = Object.create(parent);child.own = 'ownValue';// Вариант с for-in и hasOwnPropertyfor (let key in child) {if (child.hasOwnProperty(key)) {console.log(key); // 'own'}}// Вариант с Object.keysObject.keys(child).forEach(key => {console.log(key); // 'own'});
Как отвечать на собеседовании
Начните с прямого ответа: используйте hasOwnProperty() внутри for-in. Затем объясните, почему это необходимо - из-за перебора прототипных свойств. Упомяните альтернативу Object.keys() и когда её лучше применять. Покажите пример кода. Если интервьюер спросит про безопасность, добавьте про Object.prototype.hasOwnProperty.call(). Не углубляйтесь в излишние детали, если не спрашивают - держите ответ структурированным и по делу.
Что проверяет интервьюер
Интервьюер проверяет понимание цепочки прототипов в JavaScript и умение работать с наследованием свойств. Также оценивается знание встроенных методов объектов и способность выбрать правильный инструмент для задачи. Важно показать, что вы осознаёте потенциальные проблемы (например, переопределение hasOwnProperty) и знаете, как их избежать.
Типичные ошибки
- Забывают про
hasOwnPropertyи выводят все ключи, включая прототипные. - Используют
for-inбез проверки, полагая, что он перебирает только собственные свойства. - Путают
hasOwnPropertyсpropertyIsEnumerable- это разные методы. - Вызывают
hasOwnPropertyкак метод объекта без проверки на переопределение:obj.hasOwnProperty(key)может упасть, если свойствоhasOwnPropertyпереопределено.
> Похожие задачи по frontend
Как передаются массивы в JSON
Что такое Jest
Как перехватывать ошибки в промисах и чем это отличается от try-catch
Как называется подход, когда обработчик клика вешается на контейнер, а событие обрабатывается на дочерних элементах
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью