Можно ли получить доступ к значению символа в JavaScript? - PullRequest
0 голосов
/ 21 октября 2019

Я только что познакомился с концепцией символов в JavaScript. Мне сообщили, что их можно использовать для создания уникальных идентификаторов, чтобы избежать возможных конфликтов.

Например ...

let user = {
    name        : "John",
    Symbol("id"): 123,    // Symbol("id") is a unique identifier
    Symbol("id"): 123     // and the Symbol("id") here is also different and unique
 };

... Я понимаю приведенный выше код. Однако каково действительное значение идентификатора каждого «символа (« id »)»? Как мне узнать?

Любые указатели оценены.

Ответы [ 3 ]

0 голосов
/ 21 октября 2019

const id1 = Symbol("id");
const id2 = Symbol("id");

const user = {
    name: "John",
    [id1]: 123,    // "[id1]" is a unique identifier
    [id2]: 456,    // and the value of "[id2]" here is also different
};

console.log('id1:', user[id1], id1.description);
console.log('id2:', user[id2], id2.description);
0 голосов
/ 21 октября 2019

С mdn :

Каждое значение символа, возвращаемое из Symbol (), является уникальным. Значение символа может использоваться в качестве идентификатора для свойств объекта;это единственная цель типа данных.

 console.log(Symbol('foo') === Symbol('foo'))
 

Из статьи в этот ответ :

Символы ES6 аналогичнык более традиционным символам в языках, таких как Lisp и Ruby, но не настолько тесно интегрированным в язык. В Лиспе все идентификаторы являются символами. В JS идентификаторы и большинство ключей свойств по-прежнему считаются строками. Символы - это просто дополнительная опция.

Как объясняет mdn docs , вы можете получить доступ к переданному вами Description, но не к значению Symbol:

Большинство значений в JavaScript поддерживают неявное преобразование в строку. Например, мы можем предупредить почти любое значение, и оно будет работать. Символы особенные. Они не преобразуются автоматически.

Например,

let Sym = Symbol("Sym");
alert(Sym); // TypeError: Cannot convert a Symbol value to a string

Это «языковая защита» от путаницы, потому что строки и символы принципиально различны и не должны время от времени преобразовывать одно в другое.

Если мы действительноЧтобы показать символ, нам нужно вызвать .toString () для него, например,

 
let Sym = Symbol("Sym");
alert(Sym.toString()); // Symbol(Sym), now it works 

Или мы можем использовать свойство get symbol.description, чтобы получить описание, например,

 
let _Sym = Symbol("Sym");
alert(_Sym.description); // Sym 
 
0 голосов
/ 21 октября 2019

Я не смог правильно ответить на ваш вопрос, я пытался помочь вам надеяться, что это сработает

let user = { // belongs to another code
  name: "Alex"
};

let id = Symbol("id");

user[id] = 200;

alert( user[id] ); // we can access the data using the symbol as the key
...