Рубрики
Без рубрики

JavaScript символы ES6

Символы JavaScript являются примитивным типом данных с уникальными значениями. Их можно использовать в качестве идентификаторов или в качестве свойств, которые не перекрываются с другими библиотеками или модулями. Теги с JavaScript.

JavaScript Символ является примитивной структурой данных, которая имеет уникальное значение. Их можно использовать в качестве идентификаторов, поскольку никакие два символа не одинаковы. В отличие от строк, символы могут быть использованы для создания свойств, которые не перекрываются с другими библиотеками или модулями.

Пример

const sym = Symbol();
const namedSymbol = Symbol('javascript');

sym === namedSymbol // false
typeof sym // "symbol"

console.log(namedSymbol); // Symbol(javascript)
console.log(namedSymbol.description); // javascript

Довольно аккуратно, теперь наше приложение JavaScript может однозначно идентифицировать свойства без какого-либо риска столкновения с другим идентификатором. Но что, если мы хотим делиться символами через кодовую базу?

Общие символы

const sym1 = Symbol.for('javascript');
const sym2 = Symbol.for('javascript');

sym1 === sym2 // true

Когда мы используем символ. Для того, что мы можем использовать общие символы, которые доступны в Global Registry для нашей кодовой базы.

Зачем использовать символы?

Теперь, когда мы понимаем, что символы являются уникальными идентификаторами, мы можем понять потенциал для того, что может с ними можно сделать инженер-программист.

Символы могут быть использованы для метапрограммирования

const UserType = Symbol('userType');
const Administrator = Symbol('administrator');
const Guest = Symbol('guest');

const currentUser = {
  [UserType]: Administrator,
  id: 1,
  name: "Cole Turner"
};

console.log(currentUser); // {id: 1, name: "Cole Turner", Symbol(userType): Symbol(administrator)}

console.log(JSON.stringify(currentUser)); // {"id":1,"name":"Cole Turner"}

currentUser[UserType] == Administrator; // true
currentUser[UserType] == Guest; // false

В приведенном выше примере символ используется для ввода объекта. Собственность доступна только при упоминании через отражение символов. Это отлично подходит для того, чтобы когда мы хотим добавить свойства на объект, который мы не хотим появляться в не символьном отражении, таком как формат форматирования или итерации объекта JSON.

Символы отделены от строковых клавиш

const languages = {
  javascript: 'JavaScript';
};

// Extend an object without conflict
const isLocal = Symbol('local');
const localLanguages = {
  ...languages,
  [isLocal]: true
};

// Detect if we're using local or the original languages object
[languages, localLanguages].map(obj => {
  if (obj[isLocal]) {
    console.log('Local languages:', obj);
  } else {
    console.log('Original languages:', obj);
  }
});

В приведенном выше примере мы можем продлить объекты без конфликта с их первоначальными свойствами. Это также означает, что когда мы строгаем, символы не включены.

Символы могут быть использованы в качестве момента

Большое использование для символов – это когда есть необходимость в перечисленных значениях.

* * Символы JavaScript – пример Enum

const Tree = Symbol('🌴');
const Flower = Symbol('🌻');
const Leaf = Symbol('🍁');
const Mushroom = Symbol('🍄');

const plantTypes = [Tree, Flower, Leaf, Mushroom];

function createPlant(type) {
  if (!plantTypes.includes(type)) {
    throw new Error('Invalid plant type!');
  }
}

Здесь мы используем символы для управления поведением без этих свойств, протекающих в типичное отражение и предотвращение ошибок времени выполнения от опечаток.

JavaScript MetaProgramming с символами

С символами мы можем погрузиться глубоко на низкоуровневой JavaScript, чтобы изменить поведение для различных случаев использования. Это позволяет нам создавать мощные объекты, которые могут сделать больше, чем уходит в глаза. Вот несколько примеров того, как мы можем использовать символы для JavaScript MetaProgramming.

Symbol.Asynciterator.

const tenIntegers = {
  async* [Symbol.asyncIterator]() {
    for (let i = 1; i <= 10; i++) {
      yield i;
    }
  }
}

for await (const i of tenIntegers) {
  console.log(i);
  //  1
  //  ...
  //  10
}

Symbol.hasinstance.

const Loggable = Symbol('loggable');

class LoggableError extends Error {
  static [Symbol.hasInstance](instance) {
    return instance instanceof LoggableError || instance[Loggable] === true;
  }
}

class ApplicationError extends Error {
  [Loggable] = true;

  logError() {
    if (this instanceof LoggableError) {
      return;
    }

    fetch('/log', { message: this.message });
  }
}

class DatabaseError extends ApplicationError {
    [Loggable] = false;
}

Символ

const users = {
  1: { name: 'Cole Turner' },
  2: { name: 'Anonymous' },
};

function toValuesArray(obj) {
  return {
    ...obj,

    [Symbol.iterator]: function* () {
      for (const value of Object.values(this)) {
        yield value;
      }
    },
  };
}

// toValuesArray will now change the spread of our object
const arrayOfUsers = [...toValuesArray(users)];

Заключение

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

Для получения дополнительной информации Проверьте документацию MDN на символах Отказ

Оригинал: “https://dev.to/coleturner/javascript-es6-symbols-a-metaprogramming-primitive-c3b”