Этот перевод не завершён. Пожалуйста, помогите перевести эту статью с английского
Сводка
Символ (анг. Symbol) — это уникальный и неизменяемый тип данных, который может быть использован как идентификатор для свойств объектов. Символьный объект (анг. symbol object) — это объект-обёртка (англ. wrapper) для примитивного символьного типа.
Синтаксис
Symbol([описание])
Параметры
описаниеНеобязательный- Необязательный, строка. Описание символа, которое может быть использовано во время отладки, но не для доступа к самому символу.
Описание
Чтобы создать новый символьный примитив, достаточно написать Symbol(), указав по желанию строку в качестве описания этого символа:
var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");
Код выше создает три новых символа. Заметьте, что Symbol("foo") не выполняет приведение (англ. coercion) строки "foo" к символу. Это выражение создает каждый раз новый символ:
Symbol("foo") === Symbol("foo"); // false
Код ниже с оператором new бросит исключение TypeError:
var sym = new Symbol(); // TypeError
Это удерживает разработчиков от создания явного объекта-обёртки Symbol вместо нового символьного значения. Создание явных объектов-обёрток для примитивных типов доступно (например, new Boolean, new String, new Number).
Если вам действительно необходимо обернуть символ в объект, вы можете использовать функцию Object():
var sym = Symbol("foo");
typeof sym; // "symbol"
var symObj = Object(sym);
typeof symObj; // "object"
Разделяемые символы в глобальном символьном реестре
Приведенный выше синтаксис, использующий функцию Symbol(), не создаст глобальный символ, который был бы доступен в любом месте вашего кода. Для создания символов, доступных во всех файлах и в окружении (глобальной области), используйте методы Symbol.for() и Symbol.keyFor(), чтобы задать или получить символ из глобального символьного реестра.
Поиск символьных свойств у объектов
Метод Object.getOwnPropertySymbols() возвращает массив символов и позволяет получить символьные свойства конкретного объекта. Следует заметить, что при инициализации объекты не получают символьных свойств, так что этот массив будет пуст, пока вы не зададите ему какое-либо символьное свойство.
Свойства
Symbol.length- Содержит длину, всегда равную 0 (нулю).
Symbol.prototype- Содержит прототип конструктора
Symbol.
Известные символы
В добавок к вашим собственным символам, JavaScript имеет несколько встроенных символов, представляющих внутренние механизмы языка, которые не были доступны разработчикам в версиях ECMAScript 5 и более ранних. Эти символы доступны посредством следующих свойств:
-
Итерационные символы
Symbol.iterator- Метод, возвращающий итератор по умолчанию для объекта. Используется конструкцией
for...of. -
Символы регулярных выражений
Symbol.match- Метод для сопоставления объекта со строкой, также используемый для определения возможности объекта выступать в качестве регулярного выражения. Используется функцией
String.prototype.match(). Symbol.replace- Метод, заменяющий совпавшие подстроки в строке. Используется функцией
String.prototype.replace(). Symbol.search- Метод, возвращающий индекс вхождения подстроки, соответствующей регулярному выражению. Используется функцией
String.prototype.search(). Symbol.split- Метод, разбивающий строку на части в местах, соответствующих регулярному выражению. Используется функцией
String.prototype.split(). -
Другие символы
Symbol.hasInstance- Метод, определяющий, распознает ли конструктор некоторый объект как свой экземпляр. Используется оператором
instanceof. Symbol.isConcatSpreadable- Булево значение, показывающее, должен ли объект быть сведен к плоскому представлению (англ. flatten) в виде массива его элементов функцией
Array.prototype.concat(). Symbol.unscopables- Массив строковых имен свойств. Позволяет скрыть свойства от инструкции with (прежде всего для обратной совместимости).
Symbol.species- Метод, определяющий конструктор для порождённых объектов.
Symbol.toPrimitive- Метод, преобразующий объект в примитив (примитивное значение).
Symbol.toStringTag- Строковое значение, используемое в качестве описания объекта по умолчанию. Используется функцией
Object.prototype.toString()
Методы
Symbol.for(key)- Ищет существующие символы по заданному ключу и возвращает его, если он найден. В противном случае создается новый символ для данного ключа в глобальном реестре символов.
Symbol.keyFor(sym)- Получает по разделямому символу его ключ из глобального реестра символов.
Прототип Symbol
Все символы наследуют от Symbol.prototype.
Свойства
Методы
Примеры
Использование оператора typeof с символами
Оператор typeof позволяет идентифицировать символ.
typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'
Преобразование типов с символами
Следующее необходимо помнить при преобразовании типа символов.
- При попытке конвертировать символ в число, будет брошено исключение
TypeError(напр.,+symилиsym | 0). - Результатом нестрогого сравнения,
Object(sym) == sym, будетtrue. Symbol("foo") + "bar"бросает исключениеTypeError(невозможно преобразовать символ в строку). Это удерживает разработчика от, к примеру, случайного создания строкого поля у объекта из символа.- Более "безопасный" вызов
String(sym)работает с символами как вызовSymbol.prototype.toString(). Заметьте, что в то же времяnew String(sym)бросит исключение.
Символы и конструкция for...in
Символы не перечисляются при итерации for...in. В дополнение к этому, Object.getOwnPropertyNames() не вернет символьные свойства объекта. Тем не менее, их можно получить с помощью Object.getOwnPropertySymbols().
var obj = {};
obj[Symbol("a")] = "a";
obj[Symbol.for("b")] = "b";
obj["c"] = "c";
obj.d = "d";
for (var i in obj) {
console.log(i); // выведет "c" и "d"
}
Символы и JSON.stringify()
JSON.stringify() игнорирует свойства с ключами Symbol:
JSON.stringify({[Symbol("foo")]: "foo"});
// '{}'
Подробности см. JSON.stringify().
Объекты-обёртки для Symbol в качестве имен свойств
Когда объект-обёртка символа используется в качестве имени свойства, этот объект сводится к символу, который он оборачивает:
var sym = Symbol("foo");
var obj = {[sym]: 1};
obj[sym]; // 1
obj[Object(sym)]; // снова 1
Спецификации
| Спецификация | Статус | Комментарий |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Symbol' в этой спецификации. |
Стандарт | Изначальное определение |
| ECMAScript (ECMA-262) Определение 'Symbol' в этой спецификации. |
Живой стандарт |
Поддержка браузерами
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
| Компьютеры | Мобильные | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Symbol | Chrome Полная поддержка 38 | Edge
Полная поддержка
12
| Firefox Полная поддержка 36 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 36 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
Symbol() constructor | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 36 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 36 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
asyncIterator | Chrome Полная поддержка 63 | Edge Полная поддержка 79 | Firefox Полная поддержка 57 | IE Нет поддержки Нет | Opera Полная поддержка 50 | Safari Полная поддержка 11.1 | WebView Android Полная поддержка 63 | Chrome Android Полная поддержка 63 | Firefox Android Нет поддержки Нет | Opera Android Полная поддержка 46 | Safari iOS Нет поддержки Нет | Samsung Internet Android Полная поддержка 8.0 | nodejs Полная поддержка 10.0.0 |
description | Chrome Полная поддержка 70 | Edge Полная поддержка 79 | Firefox Полная поддержка 63 | IE Нет поддержки Нет | Opera Полная поддержка 57 | Safari
Полная поддержка
12.1
| WebView Android Полная поддержка 70 | Chrome Android Полная поддержка 70 | Firefox Android Полная поддержка 63 | Opera Android Полная поддержка 49 | Safari iOS
Полная поддержка
12.2
| Samsung Internet Android Полная поддержка 10.0 | nodejs Полная поддержка 11.0.0 |
for | Chrome Полная поддержка 40 | Edge Полная поддержка 12 | Firefox Полная поддержка 36 | IE Нет поддержки Нет | Opera Полная поддержка 27 | Safari Полная поддержка 9 | WebView Android Полная поддержка 40 | Chrome Android Полная поддержка 40 | Firefox Android Полная поддержка 36 | Opera Android Полная поддержка 27 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 4.0 | nodejs Полная поддержка 0.12 |
hasInstance | Chrome Полная поддержка 50 | Edge Полная поддержка 15 | Firefox Полная поддержка 50 | IE Нет поддержки Нет | Opera Полная поддержка 37 | Safari Полная поддержка 10 | WebView Android Полная поддержка 50 | Chrome Android Полная поддержка 50 | Firefox Android Полная поддержка 50 | Opera Android Полная поддержка 37 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs
Полная поддержка
6.5.0
|
isConcatSpreadable | Chrome Полная поддержка 48 | Edge Полная поддержка 15 | Firefox Полная поддержка 48 | IE Нет поддержки Нет | Opera Полная поддержка 35 | Safari Полная поддержка 10 | WebView Android Полная поддержка 48 | Chrome Android Полная поддержка 48 | Firefox Android Полная поддержка 48 | Opera Android Полная поддержка 35 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs Полная поддержка 6.0.0 |
iterator | Chrome Полная поддержка 43 | Edge Полная поддержка 12 | Firefox Полная поддержка 36 | IE Нет поддержки Нет | Opera Полная поддержка 30 | Safari Полная поддержка 10 | WebView Android Полная поддержка 43 | Chrome Android Полная поддержка 43 | Firefox Android Полная поддержка 36 | Opera Android Полная поддержка 30 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 4.0 | nodejs Полная поддержка 0.12 |
keyFor | Chrome Полная поддержка 40 | Edge Полная поддержка 12 | Firefox Полная поддержка 36 | IE Нет поддержки Нет | Opera Полная поддержка 27 | Safari Полная поддержка 9 | WebView Android Полная поддержка 40 | Chrome Android Полная поддержка 40 | Firefox Android Полная поддержка 36 | Opera Android Полная поддержка 27 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 4.0 | nodejs Полная поддержка 0.12 |
match | Chrome Полная поддержка 50 | Edge Полная поддержка 79 | Firefox Полная поддержка 40 | IE Нет поддержки Нет | Opera Полная поддержка 37 | Safari Полная поддержка 10 | WebView Android Полная поддержка 50 | Chrome Android Полная поддержка 50 | Firefox Android Полная поддержка 40 | Opera Android Полная поддержка 37 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs Полная поддержка 6.0.0 |
matchAll | Chrome Полная поддержка 73 | Edge Полная поддержка 79 | Firefox Полная поддержка 67 | IE Нет поддержки Нет | Opera Полная поддержка 60 | Safari Полная поддержка 13 | WebView Android Полная поддержка 73 | Chrome Android Полная поддержка 73 | Firefox Android Полная поддержка 67 | Opera Android Полная поддержка 52 | Safari iOS Полная поддержка 13 | Samsung Internet Android Нет поддержки Нет | nodejs Полная поддержка 12.0.0 |
replace | Chrome Полная поддержка 50 | Edge Полная поддержка 79 | Firefox Полная поддержка 49 | IE Нет поддержки Нет | Opera Полная поддержка 37 | Safari Полная поддержка 10 | WebView Android Полная поддержка 50 | Chrome Android Полная поддержка 50 | Firefox Android Полная поддержка 49 | Opera Android Полная поддержка 37 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs Полная поддержка 6.0.0 |
search | Chrome Полная поддержка 50 | Edge Полная поддержка 79 | Firefox Полная поддержка 49 | IE Нет поддержки Нет | Opera Полная поддержка 37 | Safari Полная поддержка 10 | WebView Android Полная поддержка 50 | Chrome Android Полная поддержка 50 | Firefox Android Полная поддержка 49 | Opera Android Полная поддержка 37 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs Полная поддержка 6.0.0 |
species | Chrome Полная поддержка 51 | Edge Полная поддержка 13 | Firefox Полная поддержка 41 | IE Нет поддержки Нет | Opera Полная поддержка 38 | Safari Полная поддержка 10 | WebView Android Полная поддержка 51 | Chrome Android Полная поддержка 51 | Firefox Android Полная поддержка 41 | Opera Android Полная поддержка 41 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs
Полная поддержка
6.5.0
|
split | Chrome Полная поддержка 50 | Edge Полная поддержка 79 | Firefox Полная поддержка 49 | IE Нет поддержки Нет | Opera Полная поддержка 37 | Safari Полная поддержка 10 | WebView Android Полная поддержка 50 | Chrome Android Полная поддержка 50 | Firefox Android Полная поддержка 49 | Opera Android Полная поддержка 37 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs Полная поддержка 6.0.0 |
toPrimitive | Chrome Полная поддержка 47 | Edge Полная поддержка 15 | Firefox Полная поддержка 44 | IE Нет поддержки Нет | Opera Полная поддержка 34 | Safari Полная поддержка 10 | WebView Android Полная поддержка 47 | Chrome Android Полная поддержка 47 | Firefox Android Полная поддержка 44 | Opera Android Полная поддержка 34 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs Полная поддержка 6.0.0 |
toSource | Chrome Нет поддержки Нет | Edge Нет поддержки Нет | Firefox
Нет поддержки
36 — 74
| IE Нет поддержки Нет | Opera Нет поддержки Нет | Safari Нет поддержки Нет | WebView Android Нет поддержки Нет | Chrome Android Нет поддержки Нет | Firefox Android Полная поддержка 36 | Opera Android Нет поддержки Нет | Safari iOS Нет поддержки Нет | Samsung Internet Android Нет поддержки Нет | nodejs Нет поддержки Нет |
toString | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 36 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 36 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
toStringTag | Chrome Полная поддержка 49 | Edge Полная поддержка 15 | Firefox Полная поддержка 51 | IE Нет поддержки Нет | Opera Полная поддержка 36 | Safari Полная поддержка 10 | WebView Android Полная поддержка 49 | Chrome Android Полная поддержка 49 | Firefox Android Полная поддержка 51 | Opera Android Полная поддержка 36 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs
Полная поддержка
6.0.0
|
unscopables | Chrome Полная поддержка 45 | Edge Полная поддержка 12 | Firefox Полная поддержка 48 | IE Нет поддержки Нет | Opera Полная поддержка 32 | Safari Полная поддержка 9 | WebView Android Полная поддержка 45 | Chrome Android Полная поддержка 45 | Firefox Android Полная поддержка 48 | Opera Android Полная поддержка 32 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 5.0 | nodejs Полная поддержка 0.12 |
valueOf | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 36 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 36 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
@@toPrimitive | Chrome Полная поддержка 47 | Edge Полная поддержка 15 | Firefox Полная поддержка 44 | IE Нет поддержки Нет | Opera Полная поддержка 34 | Safari Полная поддержка 10 | WebView Android Полная поддержка 47 | Chrome Android Полная поддержка 47 | Firefox Android Полная поддержка 44 | Opera Android Полная поддержка 34 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs Полная поддержка 6.0.0 |
Легенда
- Полная поддержка
- Полная поддержка
- Нет поддержки
- Нет поддержки
- Нестандартная. Ожидается плохая кросс-браузерная поддержка.
- Нестандартная. Ожидается плохая кросс-браузерная поддержка.
- Смотрите замечания реализации.
- Смотрите замечания реализации.
- Пользователь должен сам включить эту возможность.
- Пользователь должен сам включить эту возможность.