Почему Symbol работает как сложный тип данных?
Символ относится к примитивному типу данных. Это значит, что здесь присвоение какого-либо значения осуществляется с помощью копирования.
let a = 10;
let b = a; //в переменную "b" копируется значение "a"
То есть по сути 10 из переменной a и переменной b - это две разные десятки.
В сложных типах данных присваивается ссылка.
let object = {};
let a = object; //в переменную "a" кладется ссылка на тот объект, который держит переменная "object"
Тут как бы все понятно. В переменной а и object просто есть ссылка на один и тот же объект.
Ок, почему тогда если символ - это примитивный тип данных, все работает так?
let a = Symbol("Hello");
let b = a; //в переменную b копируется значение a
console.log(a == b); //true
Почему а и b равны друг другу? Символы работают как объекты? Переменная держит ссылку на символ?
Ведь, если бы осуществлялось копирование, а и b не были бы равны друг другу. Это были бы совершенно разные уникальные символы (хоть и с одним и тем же описанием). А уникальные символы не могут быть равны друг другу.
Почему это так работает? Почему в данном случае символы равны друг другу?
Ответы (1 шт):
Насколько понимаю, это было бы уже не копирование, если бы они становились разными. И это была бы куда большая неожиданность.
И это сделало бы работу с символами крайне трудной. Например, как бы мы пользовались for..of вместе с Object.getOwnPropertySymbols(object1), где каждый символ нужно было бы сначала присвоить переменной.
По сути, let a = Symbol("Hello") и let b = a — это один и тот же тип присваивания. Если при втором происходило бы изменение символа, то и при первом оно должно было бы происходить, что не имело бы смысла. Символьные ключи нельзя было бы копировать из объекта в объект
Можно сказать, что символ это примитив, копируемый по ссылке, но и это трудно продемонстрировать, поскольку символ неизменяем.