hellojs.ru
Главная - Дополнительные основы JavaScript - ES6. Тип данных Symbol

ES6. Тип данных Symbol

Размещено в категории "Дополнительные основы JavaScript"
06.10.2024 / просмотров: 39 / комментариев: 0
Ресурсы:

Таблица со встроенными символами
Документация




Необходимы для создания уникальных идентификаторов. Они уникальны и неизменяемы.

Применяются к свойствам объектов, ведь как мы знаем, кроме строк свойствами объектов ещё могут быть символы.

Символы будут уникальны, даже если будут иметь одинаковое описание.

Код

let id = Symbol('id');
let id2 = Symbol('id');

id === id2; // false

Пусть есть какой-то объект:

Код

const obj = {
  name: 'Test';
}

Свойствами могут быть либо строки, либо символы. Создадим символ:

Код

let id = Symbol('id');

В скобках это описание символа.

Добавляем в наш объект новое свойство:

Код

obj[id] = 1;

Смотрим в консоли его значение:

Код

console.log(obj[id]); // 1

То есть, по сути, наш объект такой:

Код

const obj = {
  name: 'Test',
  Symbol(id): 1
}

Символы можно создавать и без описания:

Код

let id = Symbol();

Тогда в объекте будет просто свойство Symbol()

Код

const obj = {
  name: 'Test',
  Symbol(): 1
}

Новый символ можно создать и непосредственно в объекте:

Код

const obj = {
  name: 'Test',
  [Symbol('id')]: 1
}  

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

Например, перебор с помощью for...in

Код

for (let value in obj) console.log(value); // name

Но если создать символ до объекта, а в объект передать на него ссылку

Код

let id = Symbol('id');

const obj = {
  name: 'Test',
  [id]: 1
}

и создадим в объекте метод по получению этого id

Код

let id = Symbol('id');

const obj = {
  name: 'Test',
  [id]: 1,
  getId: function() {
  return this[id];
  }
}

то теперь, вызвав этот метод, получим 1:

Код

console.log(obj.getId()); // 1  


Метод Object.getOwnPropertySymbols()



Возвращает массив всех символьных свойств, найденных непосредственно на переданном в круглые скобки объекте.

Код

console.log(Object.getOwnPropertySymbols(obj));

Так можно получить первый элемент этого массива:

Код

console.log(obj[Object.getOwnPropertySymbols(obj)[0]]); // 1

Уникальность и скрытность свойства, записанного через Symbol, позволяет нам быть уверенными, что оно не будет случайно перезаписано.

Можно "насильно" лишить символ уникальности таким образом:

Код

const myAwesomeDB = {
  movies: [],
  actors: [],
  [Symbol.for('id')]: 123
}

console.log(myAwesomeDB[Symbol.for('id')]);  
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
Сайт управляется системой uCoz