Avatar ·

Как задать имя ключа объекта через переменную в JavaScript?

Всем привет! Я только начал изучать JavaScript и столкнулся с проблемой при работе с объектами. Мне нужно создать объект, где имя ключа (свойства) должно браться из переменной, а не быть статической строкой. Вот что я пытаюсь сделать: у меня есть переменная `keyName`, которая содержит строку "userName". Я хочу создать объект, где ключом будет значение этой переменной, а значением — "John". Я пробовал так: ```javascript let keyName = "userName"; let obj = { keyName: "John" }; console.log(obj); // { keyName: "John" } ``` Но в результате ключ называется `keyName`, а не `userName`. То есть JavaScript использует имя переменной как имя ключа, а не её значение. Я понимаю, что это не то, что мне нужно. Мне нужно, чтобы ключ был динамическим, то есть я хочу получить объект `{ userName: "John" }`. Как это сделать? Я слышал, что в ES6 есть какие-то фичи для этого, но не уверен. Подскажите, пожалуйста, правильный синтаксис. Также буду рад, если объясните, почему мой код не работает и как вообще работает создание ключей в объектах. Заранее спасибо! <<>>

Использование вычисляемых свойств (computed property names)

Ваша проблема решается с помощью синтаксиса вычисляемых свойств (computed property names), который появился в ES6 (ECMAScript 2015). Чтобы использовать значение переменной как имя ключа, нужно заключить имя переменной в квадратные скобки [] внутри литерала объекта.

Вот как это работает:

let keyName = "userName";
let obj = { [keyName]: "John" };
console.log(obj); // { userName: "John" }

Квадратные скобки [] говорят JavaScript: "вычисли значение выражения внутри скобок и используй его как имя свойства". В нашем случае выражением является переменная keyName, её значение — строка "userName", поэтому ключом становится именно "userName".

Вы можете использовать любое выражение внутри скобок, не только переменную:

let prefix = "user";
let obj = {
  [prefix + "Name"]: "John",
  [prefix + "Age"]: 30
};
console.log(obj); // { userName: "John", userAge: 30 }

Почему ваш код не работает?

Когда вы пишете { keyName: "John" }, JavaScript интерпретирует это как создание свойства с именем keyName (строка), а не как использование переменной. В синтаксисе литерала объекта слева от двоеточия всегда ожидается статическое имя свойства, если не используются квадратные скобки.

Альтернативные способы

Если вы работаете со старым кодом (до ES6) или вам нужно добавить свойство позже, можно использовать:

  1. Точечную нотацию — не подходит для динамических ключей, так как obj.keyName всегда обращается к свойству с именем "keyName".
  2. Скобочную нотацию — универсальный способ:
let keyName = "userName";
let obj = {};
obj[keyName] = "John";
console.log(obj); // { userName: "John" }

Этот метод работает во всех версиях JavaScript и часто используется для добавления динамических свойств после создания объекта.

Комбинирование со статическими свойствами

Вы можете смешивать вычисляемые и статические свойства в одном объекте:

let dynamicKey = "role";
let user = {
  name: "John",
  [dynamicKey]: "admin",
  age: 30
};
console.log(user); // { name: "John", role: "admin", age: 30 }

Важные моменты

  • Выражение внутри скобок приводится к строке. Если передать число, оно станет строкой: { [1]: "value" } создаст свойство с ключом "1".
  • Можно использовать вызовы функций: { [getKey()]: "value" }, где getKey() возвращает строку.
  • Синтаксис работает не только в литералах объектов, но и в классах (для вычисляемых имён методов).

Таким образом, для вашей задачи используйте квадратные скобки при создании объекта или скобочную нотацию для добавления свойства после создания. Оба подхода корректны, но первый более лаконичен и читаем.

<<>>

Использование Object.assign() или spread-оператора

Если вы предпочитаете функциональный стиль или работаете с неизменяемыми объектами, можно создать новый объект с динамическим ключом через Object.assign() или spread-оператор.

let keyName = "userName";
let value = "John";

// Через Object.assign()
let obj = Object.assign({}, { [keyName]: value });
console.log(obj); // { userName: "John" }

// Через spread-оператор (ES2018)
let obj2 = { ...{}, [keyName]: value };
console.log(obj2); // { userName: "John" }

Эти методы особенно полезны, когда нужно объединить несколько объектов или добавить динамическое свойство к уже существующему объекту без мутации оригинала:

let base = { id: 1 };
let dynamicKey = "email";
let full = { ...base, [dynamicKey]: "john@example.com" };
console.log(full); // { id: 1, email: "john@example.com" }

Когда это удобно

  • При работе с иммутабельными данными (React, Redux).
  • Когда нужно добавить несколько динамических ключей из массива.
  • Для совместимости со старыми браузерами (если не используется Babel) — Object.assign() доступен с ES6.

Обратите внимание: spread-оператор для объектов требует поддержки ES2018, но в современных проектах это стандарт.