> Как в цикле 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).

Пример кода

JAVASCRIPT
const parent = { inherited: 'value' };
const child = Object.create(parent);
child.own = 'ownValue';
// Вариант с for-in и hasOwnProperty
for (let key in child) {
if (child.hasOwnProperty(key)) {
console.log(key); // 'own'
}
}
// Вариант с Object.keys
Object.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 переопределено.

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

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