> Как добавить числовое свойство в объект в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Aston

Стек: JavaScript

> Пример ответа

Короткий ответ

Добавить числовое свойство в объект можно несколькими способами: через точечную нотацию (obj.prop = 42), через квадратные скобки (obj['prop'] = 42), через Object.defineProperty или через spread-оператор при создании нового объекта. Числовое значение не требует специальной обработки - JavaScript автоматически определит тип. Важно помнить, что ключи объекта всегда строки или символы, поэтому числовые ключи преобразуются в строки.

Подробное объяснение

В JavaScript объекты - это коллекции пар "ключ-значение". Ключи всегда являются строками или символами, даже если вы используете число как ключ - оно будет неявно преобразовано в строку. Значение может быть любого типа, включая числа.

Основные способы добавления свойства:

  1. Точечная нотация - самый простой и читаемый способ, но требует, чтобы имя свойства было валидным идентификатором (не начиналось с цифры, не содержало дефисов и т.д.).

  2. Квадратные скобки - позволяет использовать любые строки, включая те, которые не являются валидными идентификаторами, а также динамические ключи (например, из переменной).

  3. Object.defineProperty - даёт больше контроля: можно задать атрибуты свойства (writable, enumerable, configurable). Полезен, когда нужно создать неперечисляемое или неизменяемое свойство.

  4. Spread-оператор - создаёт новый объект, копируя свойства существующего и добавляя новые. Не мутирует исходный объект.

  5. Object.assign - аналогичен spread, но работает как метод.

При добавлении числового свойства важно понимать: если вы используете число как ключ, оно станет строкой. Например, obj[1] = 10 создаст ключ "1". Это может вызвать путаницу при итерации, так как числовые ключи автоматически сортируются в порядке возрастания.

На практике

В реальной фронтенд-разработке чаще всего используется точечная нотация или квадратные скобки. Точечная нотация предпочтительна для статических, известных заранее имён свойств. Квадратные скобки - для динамических ключей, например, при работе с данными из API, где ключи могут содержать дефисы или пробелы.

Object.defineProperty применяется реже, но незаменим, когда нужно создать свойство с особыми атрибутами - например, для внутренних служебных данных, которые не должны появляться при JSON.stringify или в for...in.

Spread-оператор удобен в функциональном стиле программирования, когда нужно избежать мутаций - например, в Redux-редьюсерах или при работе с иммутабельными структурами данных.

Пример кода

JAVASCRIPT
// Точечная нотация
const user = {};
user.age = 30;
console.log(user.age); // 30
// Квадратные скобки
const key = 'score';
user[key] = 100;
user['total-count'] = 5; // ключ с дефисом
console.log(user['total-count']); // 5
// Числовой ключ
user[1] = 42;
console.log(user['1']); // 42 - ключ стал строкой
// Object.defineProperty
Object.defineProperty(user, 'id', {
value: 12345,
enumerable: false, // не появится в for...in и Object.keys
writable: false, // нельзя изменить
configurable: false // нельзя удалить
});
// Spread - создание нового объекта
const updatedUser = { ...user, level: 7 };
console.log(updatedUser.level); // 7
console.log(user.level); // undefined - исходный объект не изменён
// Object.assign
const anotherUser = Object.assign({}, user, { level: 8 });

Как отвечать на собеседовании

Начните с самого простого способа - точечной нотации, затем упомяните квадратные скобки для динамических ключей. Покажите понимание, что ключи всегда строки. Упомяните Object.defineProperty как более продвинутый инструмент с контролем атрибутов. Если уместно, расскажите про spread и иммутабельность - это покажет ваш уровень senior. Завершите кратким примером, демонстрирующим разницу между способами.

Что проверяет интервьюер

Интервьюер оценивает:

  • базовое понимание структуры объекта и типов данных;
  • знание синтаксических конструкций и их ограничений;
  • понимание неявного преобразования ключей в строки;
  • осведомлённость о продвинутых возможностях (defineProperty, атрибуты свойств);
  • способность выбрать подходящий способ под конкретную задачу;
  • понимание мутабельности и иммутабельности (если упомянули spread).

Типичные ошибки

  • Использование точечной нотации для ключей, которые не являются валидными идентификаторами - синтаксическая ошибка.
  • Забывание, что числовые ключи становятся строками, что приводит к путанице при обращении.
  • Мутация объекта через spread - на самом деле spread создаёт новый объект, но если внутри есть вложенные объекты, они копируются по ссылке (shallow copy).
  • Использование Object.defineProperty без необходимости - это избыточно для простых случаев.
  • Попытка использовать зарезервированные слова как имена свойств через точечную нотацию - в современном JavaScript это допустимо, но может вызвать путаницу.

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

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