В този урок ще научите за JavaScript Symbol с помощта на примери.
JavaScript символ
JavaScript ES6 въведе нов примитивен тип данни, наречен Symbol
. Символите са неизменни (не могат да бъдат променяни) и са уникални. Например,
// two symbols with the same description const value1 = Symbol('hello'); const value2 = Symbol('hello'); console.log(value1 === value2); // false
Въпреки че и value1 и value2 съдържат едно и също описание, те са различни.
Създаване на символ
Използвате Symbol()
функцията, за да създадете a Symbol
. Например,
// creating symbol const x = Symbol() typeof x; // symbol
Можете да предадете незадължителен низ като негово описание. Например,
const x = Symbol('hey'); console.log(x); // Symbol(hey)
Символ за достъп Описание
За достъп до описанието на символ използваме .
оператора. Например,
const x = Symbol('hey'); console.log(x.description); // hey
Добавете символ като ключов обект
Можете да добавяте символи като ключ в обект, като използвате квадратни скоби ()
. Например,
let id = Symbol("id"); let person = ( name: "Jack", // adding symbol as a key (id): 123 // not "id": 123 ); console.log(person); // (name: "Jack", Symbol(id): 123)
Символите не са включени в за … в Loop
На for… in
линия не обхождане на символични свойства. Например,
let id = Symbol("id"); let person = ( name: "Jack", age: 25, (id): 12 ); // using for… in for (let key in person) ( console.log(key); )
Изход
име възраст
Полза от използването на символи в обект
Ако един и същ кодов фрагмент се използва в различни програми, тогава е по-добре да се използва Symbols
в обектния ключ. Това е така, защото можете да използвате едно и също име на ключ в различни кодове и да избегнете проблеми с дублирането. Например,
let person = ( name: "Jack" ); // creating Symbol let id = Symbol("id"); // adding symbol as a key person(id) = 12;
В горната програма, ако person
обектът се използва и от друга програма, тогава не бихте искали да добавите свойство, което може да бъде достъпно или променено от друга програма. Следователно, като използвате Symbol
, вие създавате уникално свойство, което можете да използвате.
Сега, ако другата програма също трябва да използва свойство с име id , просто добавете символ с име id
и няма да има проблеми с дублирането. Например,
let person = ( name: "Jack" ); let id = Symbol("id"); person(id) = "Another value";
В горната програма, дори ако едно и също име се използва за съхраняване на стойности, Symbol
типът данни ще има уникална стойност.
В горната програма, ако се използваше низовият ключ, тогава по-късната програма щеше да промени стойността на свойството. Например,
let person = ( name: "Jack" ); // using string as key person.id = 12; console.log(person.id); // 12 // Another program overwrites value person.id = 'Another value'; console.log(person.id); // Another value
В горната програма втората user.id
замества предишната стойност.
Символни методи
Със Symbol има различни методи.
Метод | Описание |
---|---|
for() | Търси съществуващи символи |
keyFor() | Връща споделен ключ от символ от глобалния регистър на символите. |
toSource() | Връща низ, съдържащ източника на обекта Symbol |
toString() | Връща низ, съдържащ описанието на символа |
valueOf() | Връща примитивната стойност на обекта Symbol. |
Пример: Символни методи
// get symbol by name let sym = Symbol.for('hello'); let sym1 = Symbol.for('id'); // get name by symbol console.log( Symbol.keyFor(sym) ); // hello console.log( Symbol.keyFor(sym1) ); // id
Свойства на символа
Имоти | Описание |
---|---|
asyncIterator | Връща AsyncIterator по подразбиране за обект |
hasInstance | Определя дали обектът на конструктора разпознава обект като негов екземпляр |
isConcatSpreadable | Показва дали обектът трябва да бъде приравнен към елементите на масива |
iterator | Връща итератора по подразбиране за обект |
match | Съвпадения срещу низ |
matchAll | Връща итератор, който дава съвпадения на регулярния израз срещу низ |
replace | Заменя съвпадащи поднизове на низ |
search | Връща индекса в низ, който съответства на регулярния израз |
split | Разделя низ в индексите, които съответстват на регулярен израз |
species | Създава производни обекти |
toPrimitive | Преобразува обект в примитивна стойност |
toStringTag | Дава описание по подразбиране на обект |
description | Връща низ, съдържащ описанието на символа |
Пример: Пример за свойства на символи
const x = Symbol('hey'); // description property console.log(x.description); // hey const stringArray = ('a', 'b', 'c'); const numberArray = (1, 2, 3); // isConcatSpreadable property numberArray(Symbol.isConcatSpreadable) = false; let result = stringArray.concat(numberArray); console.log(result); // ("a", "b", "c", (1, 2, 3))