> Как получить все ключи объекта в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: EvApps, The Tribe, Kaspersky, IT-One, Avito
Стек: JavaScript
> Пример ответа
Короткий ответ
Для получения всех ключей объекта в JavaScript используется статический метод Object.keys(), возвращающий массив собственных перечисляемых строковых свойств. Для нестроковых Symbol-ключей применяется Object.getOwnPropertySymbols(), а для всех собственных ключей (включая неперечисляемые) - Reflect.ownKeys(). Порядок ключей в массиве соответствует порядку добавления для строковых и числовых индексов.
Подробное объяснение
Object.keys() - основной и наиболее часто используемый способ. Он возвращает только собственные (не унаследованные через prototype) перечисляемые свойства с ключами-строками. Если нужны все собственные ключи, включая неперечисляемые, используется Reflect.ownKeys(), который комбинирует Object.getOwnPropertyNames() (строковые, включая неперечисляемые) и Object.getOwnPropertySymbols() (символьные ключи).
Важно понимать различие между собственными и унаследованными свойствами. Object.keys() не включает свойства из цепочки прототипов. Для их получения можно использовать for...in с проверкой hasOwnProperty(), но это менее производительно.
Порядок ключей в результирующем массиве: сначала целочисленные индексы по возрастанию, затем строковые ключи в порядке добавления, затем Symbol-ключи в порядке добавления (для Reflect.ownKeys()).
На практике
Выбор метода зависит от задачи:
Object.keys()- для большинства случаев, когда нужны только перечисляемые строковые ключиfor...in- если нужны и унаследованные перечисляемые свойства (но обычно это антипаттерн)Reflect.ownKeys()- для метапрограммирования, работы с Symbol-ключами или неперечисляемыми свойствамиObject.getOwnPropertyNames()- когда нужны все строковые ключи, включая неперечисляемые
Производительность: Object.keys() оптимизирован в современных движках и быстрее for...in с hasOwnProperty. Для больших объектов (10⁵+ ключей) разница может быть значительной.
Пример кода
JAVASCRIPTconst obj = {name: 'Alice',age: 30,[Symbol('id')]: 123};// Собственные перечисляемые строковые ключиconsole.log(Object.keys(obj)); // ['name', 'age']// Все собственные ключи (строковые + символьные)console.log(Reflect.ownKeys(obj)); // ['name', 'age', Symbol(id)]// Только символьные ключиconsole.log(Object.getOwnPropertySymbols(obj)); // [Symbol(id)]// Унаследованные ключи (через прототип)const parent = { inherited: true };const child = Object.create(parent);child.own = 'value';console.log(Object.keys(child)); // ['own']// for...in включает унаследованныеfor (const key in child) {if (child.hasOwnProperty(key)) {console.log(key); // 'own'}}
Как отвечать на собеседовании
Начни с Object.keys() как основного решения, затем упомяни альтернативы для специфических случаев. Покажи понимание разницы между собственными и унаследованными свойствами, перечисляемыми и неперечисляемыми. Упомяни Symbol-ключи и Reflect.ownKeys() как более полный метод. Если спросят про порядок, объясни правила сортировки. Избегай рекомендации for...in без фильтрации - это считается устаревшим подходом.
Что проверяет интервьюер
- Знание базовых методов работы с объектами
- Понимание внутреннего устройства объектов (собственные vs унаследованные свойства, флаги дескрипторов)
- Осведомлённость о Symbol и метапрограммировании
- Умение выбирать правильный инструмент под задачу
- Понимание производительности разных подходов
Типичные ошибки
- Использование
for...inбезhasOwnProperty- включает унаследованные ключи - Путаница между
Object.keys()иObject.getOwnPropertyNames()- второй возвращает и неперечисляемые - Игнорирование Symbol-ключей -
Object.keys()их не видит - Предположение, что
Object.keys()гарантирует порядок в старых браузерах (ES5 не специфицировал порядок) - Использование
Object.keys()на null/undefined без проверки - будет TypeError
> Похожие задачи по frontend
Что такое всплытие и погружение событий в JavaScript и что происходит раньше
Как работает цепочка Promise.then.catch.then.catch.then в JavaScript и когда выполняется последний then
Как работает Promise.all в JavaScript
Как работает сборщик мусора в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью