Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 429новых вакансий за сутки·55 639вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 676
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 396 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 776
  • Облачные технологии6 635
  • QA вакансии2 167
  • Android1 317
  • Инженер данных882
  • Продакт-менеджер317

Разработка

  • iOS1 230
  • Backend вакансии1 213
  • AI вакансии550
  • Fullstack вакансии502
  • Frontend вакансии422
  • Mobile вакансии28

По стеку

  • Go5 214
  • Java3 144
  • Kotlin1 117
  • Node.js1 005
  • Rust847
  • .NET660
  • PHP319
  • C++268
  • C#208

DevOps и инфраструктура

  • Kubernetes3 918
  • Linux-инфраструктура2 844
  • DevOps вакансии2 687
  • Terraform / IaC2 172
  • Мониторинг и Observability1 067
  • CI/CD917
  • SRE309
  • Кибербезопасность33

Аналитика и данные

  • Аналитик данных539
  • Data Scientist446
  • Бизнес-аналитик404
  • Системный аналитик68

Другие направления

  • Проджект-менеджер105
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США26 310
  • Вакансии в Европе10 449
  • Работа в России3 624
  • Вакансии в Канаде2 314

По формату

  • Удалённые вакансии43 704
  • Релокация в США26 310
  • Гибридная работа5 625
  • Офисная работа4 394

По уровню

  • Senior вакансии23 003
  • Middle вакансии11 899
  • Junior вакансии3 939

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise187 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме JavaScriptВсе вопросы
JavaScriptMiddleТеория

Объясните Symbol в JavaScript и в каких случаях его применять.

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Symbol — уникальный примитивный тип, гарантирующий отсутствие коллизий ключей. Используется для приватных/метаданных свойств, well-known symbols (@@iterator, @@toPrimitive) и констант перечислений.

Что такое Symbol

Symbol — примитивный тип, введённый в ES2015. Каждый вызов Symbol() создаёт значение, гарантированно уникальное во всей программе. Символы не сериализуются в JSON и не перечисляются обычными методами объекта.

const s1 = Symbol("id");
const s2 = Symbol("id");
console.log(s1 === s2); // false — всегда уникальны
console.log(typeof s1); // "symbol"

Основные применения

1. Уникальные ключи свойств без коллизий

Библиотека может добавить приватные метаданные в чужой объект, не рискуя затереть поля пользователя:

const _cache = Symbol("cache");

function withCache(obj) {
  obj[_cache] = {};
  return obj;
}

const user = { name: "Alice" };
withCache(user);

console.log(Object.keys(user));          // ["name"] — _cache не виден
console.log(JSON.stringify(user));       // {"name":"Alice"} — не сериализуется
console.log(user[_cache]);               // {} — доступно по ссылке на символ

2. Well-known symbols — встроенные протоколы

JavaScript использует предопределённые символы для кастомизации поведения объектов:

// Symbol.iterator — сделать объект итерируемым
class Range {
  constructor(start, end) {
    this.start = start;
    this.end = end;
  }
  [Symbol.iterator]() {
    let current = this.start;
    const end = this.end;
    return {
      next() {
        return current <= end
          ? { value: current++, done: false }
          : { value: undefined, done: true };
      }
    };
  }
}

const range = new Range(1, 5);
console.log([...range]); // [1, 2, 3, 4, 5]

// Symbol.toPrimitive — управление приведением типов
const money = {
  amount: 100,
  currency: "USD",
  [Symbol.toPrimitive](hint) {
    if (hint === "number") return this.amount;
    if (hint === "string") return `${this.amount} ${this.currency}`;
    return this.amount; // default
  }
};
console.log(+money);     // 100
console.log(`${money}`); // "100 USD"

// Symbol.hasInstance — кастомный instanceof
class EvenNumber {
  static [Symbol.hasInstance](n) {
    return typeof n === "number" && n % 2 === 0;
  }
}
console.log(4 instanceof EvenNumber); // true
console.log(3 instanceof EvenNumber); // false

3. Константы-перечисления без риска совпадений

const Direction = {
  UP:    Symbol("UP"),
  DOWN:  Symbol("DOWN"),
  LEFT:  Symbol("LEFT"),
  RIGHT: Symbol("RIGHT")
};

// Нельзя случайно сравнить с произвольной строкой
function move(dir) {
  if (dir === Direction.UP) console.log("moving up");
}
move(Direction.UP); // "moving up"
move("UP");         // ничего — строка !== Symbol

4. Symbol.for — глобальный реестр

Для символов, которые должны быть одинаковы в разных модулях или iframe:

const s1 = Symbol.for("app.userId");
const s2 = Symbol.for("app.userId");
console.log(s1 === s2); // true — один и тот же символ из реестра

console.log(Symbol.keyFor(s1)); // "app.userId"

Подводные камни

  • Символы не попадают в JSON.stringify, Object.keys, for...in — это удобно для приватных полей, но неожиданно, если нужна сериализация.
  • Object.getOwnPropertySymbols(obj) всё равно возвращает все символьные ключи — настоящей приватности нет; для этого используйте #privateField (class fields).
  • Symbol() без new — new Symbol() бросает TypeError; это примитив, не объект.
  • Symbol.for разделяет реестр между realms в одном процессе, но не между iframe с разным origin.
  • Описание символа (Symbol("desc")) — только для отладки; два символа с одинаковым описанием не равны.
  • Spread { ...obj } и Object.assign копируют символьные свойства — они не полностью «невидимы».
  • TypeScript требует явного объявления индекса через [key: symbol]: unknown в интерфейсах, иначе symbol-ключи не типизируются.

Частые вопросы на собеседовании

  • Как защититься от XSS в браузерном приложении? Где помогают CSP, escaping и Trusted Types?
  • В чём разница между var, let и const? Как hoisting влияет на каждое из них?
  • Что такое Promise? Чем они отличаются от callback'ов?
  • Для каких задач JavaScript является сильным выбором, а где лучше честно выбрать другой язык?

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

  • Смешивать «Symbol» с похожим механизмом без критерия выбора.
  • Игнорировать риск: неверно оценить границы применения темы «Symbol» и получить хрупкое решение.
  • Показывать только синтаксис и не объяснять поведение в runtime или сборке.

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

  • Объясняет уникальные property keys и встроенные well-known символы.
  • Показывает на примере, как работает: каждый Symbol() уникален, даже с одинаковым description; символы полезны для избежания коллизий ключей и настройки протоколов вроде iteration через Symbol.iterator.
  • Называет production-нюанс и граничный случай для темы «Symbol».

Как вы знаете этот вопрос?

Проверить себя по теме JavaScript →

Источники

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol

Связанные темы

JavaScriptjavascript-languageobject-model

Вакансии с этим навыком

JavaScript вакансии
  • Software Engineer
  • Staff SW Development Engineer in Test
  • Senior Full Stack Engineer - Observability APM UI
  • Sr. Staff Software Development Engineer - Automation
  • Backend Engineer