Краткий обзор символов JavaScript

1656520566 kratkij obzor simvolov javascript

автор Вали Шах

1*3AzH-G1JpbL4UhzH5TXS5w
Символы — JS Primitives

символы

Символы новые примитивный тип, представленный в ES6. Символы абсолютно уникальными идентификаторами. Так же, как и их примитивные собратья (Номер, строка, логическое значение), их можно создать с помощью заводской функции Symbol() возвращает символ.

const symbol = Symbol('description')

Каждый раз, когда вы вызываете заводскую функцию, создается новый уникальный символ. Необязательный параметр с строковым значением — это строка описывания, которая отображается при печати символа.

> symbol
Symbol(description)

Каждый символ, возвращенный Symbol() является уникальным, поэтому каждый символ имеет свою индивидуальность:

> Symbol() === Symbol()
false

Вы можете увидеть, что символы примитивны, если применить typeof оператор к одному из них – он вернет новый специфический для символа результат:

> typeof symbol
'symbol'

Случай использования: символы как ключи непубличных свойств

Когда у JavaScript есть иерархии наследования, у вас есть два типа свойств (например, созданные с помощью классов, чисто прототипный подход):

  • Общественный свойства видят клиенты кода
  • Частный свойства используются внутри частей, составляющих иерархию наследования (например, классы, объекты).

Для удобства использования общедоступные свойства обычно имеют строчные ключи. Но для частных свойств со строчными ключами случайные столкновения имен могут стать проблемой. Поэтому символы – хороший выбор.

Например, в следующем коде символы используются для частных свойств _counter и _action:

const _counter = Symbol('counter');
const _action  = Symbol('action');
class Countdown {
    constructor(counter, action) {
        this[_counter] = counter;
        this[_action] = action;
    }
    dec() {
        let counter = this[_counter];
        if (counter < 1) return;
        counter--;
        this[_counter] = counter;
        if (counter === 0) {
            this[_action]();
        }
    }
}

Обратите внимание, что символы защищают вас только от конфликтов имен, а не от несанкционированного доступа. Вы можете узнать все ключи свойств объекта, включая символы, с помощью следующего:

const obj = {
  [Symbol('my_key')]  : 1, 
   enum               : 2, 
   nonEnum            : 3
};

Object.defineProperty(obj, 'nonEnum', { enumerable: false }); // Making 'nonEnum' as not enumerable.

// Ignores symbol-valued property keys:
> Object.getOwnPropertyNames(obj)
['enum', 'nonEnum']

// Ignores string-valued property keys:
> Object.getOwnPropertySymbols(obj)
[Symbol(my_key)]

// Considers all kinds of keys:
> Reflect.ownKeys(obj)
[Symbol(my_key),'enum', 'nonEnum']

// Only considers enumerable property keys that are strings:
> Object.keys(obj)
['enum']

Действительно ли нам нужны символы?

Используйте символы, если ваше требование одно из следующих:

  • Перечисление: Чтобы определить константы с семантическими именами и уникальными значениями.
const directions = {
  UP   : Symbol( ‘UP’ ),
  DOWN : Symbol( ‘DOWN’ ),
  LEFT : Symbol( ‘LEFT’ ),
  RIGHT: Symbol( ‘RIGHT’ )
};
  • Столкновение имен: когда нужно предотвратить столкновения с ключами в объектах
  • Конфиденциальность: когда вы не хотите, чтобы свойства вашего объекта были перечислены
  • Протоколы: Чтобы определить, как можно повторять объект.
    Представьте, например, библиотеку dragula определение протокола через Symbol.for(dragula.moves) . Вы можете добавить метод к этому Symbol к любому элементу DOM. Если элемент DOM следует протоколу, то dragula мог позвонить el[Symbol.for('dragula.moves')]() определенный пользователем метод для подтверждения того, можно ли переместить элемент.
  • Известные символы: Кроме символов, определенных пользователем, JavaScript имеет некоторые встроенные символы. Они представляют поведение внутреннего языка, которое не было доступно для разработчиков в здесь.

Вывод

Symbols JavaScript может обеспечить уникальность уровня доступа к объектам. Всем разработчикам следует иметь базовое представление о них и их разные варианты использования.

code = coffee + developer

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *