← Назад к вопросам

Как передать ключи объекта?

2.0 Middle🔥 201 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы передачи ключей объекта

В JavaScript есть несколько эффективных способов получить и передать ключи объекта. Выбор метода зависит от того, какие ключи нужны и как их потом использовать.

Object.keys()

Самый распространённый и универсальный способ. Возвращает массив собственных перечисляемых свойств объекта (не включает наследованные и символы).

const user = { name: "Alice", age: 30, email: "alice@example.com" };

const keys = Object.keys(user);
console.log(keys); // ["name", "age", "email"]

// Передаю ключи функции для итерации
function printValues(obj) {
  Object.keys(obj).forEach(key => {
    console.log(`${key}: ${obj[key]}`);
  });
}
printValues(user);

Object.getOwnPropertyNames()

Похож на Object.keys(), но включает также неперечисляемые свойства. Полезен для работы с внутренними свойствами.

const obj = {};
Object.defineProperty(obj, "hidden", {
  value: "secret",
  enumerable: false // неперечисляемое свойство
});

console.log(Object.keys(obj));           // []
console.log(Object.getOwnPropertyNames(obj)); // ["hidden"]

Reflect.ownKeys()

Самый полный способ — возвращает ВСЕ ключи, включая символы и неперечисляемые свойства.

const sym = Symbol("id");
const obj = { name: "Bob", [sym]: 123 };

console.log(Object.keys(obj));      // ["name"]
console.log(Reflect.ownKeys(obj));  // ["name", Symbol(id)]

Object.entries()

Если нужны не только ключи, но и значения. Очень удобен для преобразований.

const settings = { theme: "dark", language: "en", notifications: true };

const config = Object.fromEntries(
  Object.entries(settings).map(([key, value]) => {
    return [key, key === "theme" ? value.toUpperCase() : value];
  })
);

console.log(config);
// { theme: "DARK", language: "en", notifications: true }

for...in цикл

Итерирует по всем перечисляемым свойствам, включая наследованные. Нужно быть осторожным с наследованием.

const parent = { inherited: "value" };
const child = Object.create(parent);
child.own = "property";

for (let key in child) {
  console.log(key); // own, inherited
}

// Безопасная версия
for (let key in child) {
  if (child.hasOwnProperty(key)) {
    console.log(key); // только own
  }
}

Практический пример: валидация формы

function validateForm(formData) {
  const errors = {};
  const requiredFields = { name: "Имя", email: "Email", age: "Возраст" };
  
  Object.keys(requiredFields).forEach(field => {
    if (!formData[field]) {
      errors[field] = `${requiredFields[field]} обязательно`;
    }
  });
  
  return Object.keys(errors).length === 0 ? null : errors;
}

const result = validateForm({ name: "John", email: "", age: 25 });
console.log(result); // { email: "Email обязательно" }

Рекомендации

  • Object.keys() — для обычных случаев (99% ситуаций)
  • Object.entries() — если нужны ключи И значения
  • Reflect.ownKeys() — если работаешь с символами или неперечисляемыми свойствами
  • for...in — редко, только если нужны наследованные свойства