> Как получить все ключи объекта в 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⁵+ ключей) разница может быть значительной.

Пример кода

JAVASCRIPT
const 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

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

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