Symbol и Symbol.for - в чем разница?

163
25 января 2019, 13:40

Не могу понять что дает объявления Symbol идентификаторов через for.
Читал несколько статей, суть разницы не уловил. В чем разница и в каких случаях полезно через sybmol.for объявить свойство объекта?

Answer 1

В оф. документах вроде как все описано

В противоположность вызову Symbol(), функция Symbol.for() создаёт символ, доступный в глобальном списке реестра символов. Symbol.for() не создаёт новый символ при каждом вызове, вместо этого, метод сначала проверяет, существует ли символ с заданным идентификатором в реестре — и возвращает его, если тот присутствует. Если символ с заданным ключом не найден, Symbol.for() создаст новый глобальный символ.

То есть по сути, символ сравнивается как и объект, по ссылке. Даже если мы создадим два "одинаковых" символа, они не будут равны

const aSymbol = Symbol('a');
const bSymbol = Symbol('a'); // должны быть равны?
aSymbol === bSymbol; // нет :(

Если создавать символ через Symbol.for, то мы сможем получить этот символ в другом месте.

function createSymbol(name) {
   Symbol.for(name);
}
createSymbol('a');
const aSymbol = Symbol.for('a');
const bSymbol = Symbol.for('a');
aSymbol === bSymbol; // теперь норм

Если говорить простым языком, то Symbol.for - это просто хранилище для символов, к которому можно обратиться по имени. Сами можете такое сделать с помощью обычного объекта

window.GlobalSymbol = {
  store_: {},
  for: function(name) {
    if(!this.store_[name]) {
      this.store_[name] = Symbol(name)
    }
    return this.store_[name]
  }
}
console.log(GlobalSymbol.for('name') === GlobalSymbol.for('name'));
console.log(GlobalSymbol.for('name'));
READ ALSO
Сборщик js для маленьких библиотек

Сборщик js для маленьких библиотек

К примеру есть два файла scriptjs с функцией main

188
Библиотека для создания форм

Библиотека для создания форм

Мне на сайте нужно добавить такую функцию для администратора, которая позволяет создавать ему любую форму для отправки пользователямЧто-то...

187
Запрет выполнения функции для старых Safari

Запрет выполнения функции для старых Safari

Столкнулся с такой проблемой,- есть необходимость выполнить некий скрипт на JS, но поскольку в старых версиях IOS для Iphone 6 (Safari версии 8 и ниже...

168