Почему 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 шт):

Автор решения: vsemozhebuty

Насколько понимаю, это было бы уже не копирование, если бы они становились разными. И это была бы куда большая неожиданность.

И это сделало бы работу с символами крайне трудной. Например, как бы мы пользовались for..of вместе с Object.getOwnPropertySymbols(object1), где каждый символ нужно было бы сначала присвоить переменной.

По сути, let a = Symbol("Hello") и let b = a — это один и тот же тип присваивания. Если при втором происходило бы изменение символа, то и при первом оно должно было бы происходить, что не имело бы смысла. Символьные ключи нельзя было бы копировать из объекта в объект

Можно сказать, что символ это примитив, копируемый по ссылке, но и это трудно продемонстрировать, поскольку символ неизменяем.

→ Ссылка