You signed in with another tab or window.Reload to refresh your session.You signed out in another tab or window.Reload to refresh your session.You switched accounts on another tab or window.Reload to refresh your session.Dismiss alert
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Якщо ви знайомі з Ruby чи іншою мовою програмування, яка також має «символи» - будь ласка, не думайте що це те саме. Символи в JavaScript мають свої особливості.
Якщо ви знайомі з Ruby чи іншою мовою програмування, яка також має «символи» - будь ласка, не думайте, що це те саме. Символи в JavaScript мають свої особливості.
Отже, підсумовуючи, символи -- це "примітивні унікальні значення" з додатковим описом. Подивімось, де ми можемо їх використовувати.
Expand DownExpand Up
@@ -172,9 +172,9 @@ for (let key in user) alert(key); // name, age (дані ключі не є си
[Object.keys(user)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) також ігнорує їх. Це частина загального принципу "приховування символьних властивостей". Якщо інший скрипт або бібліотека спробує перебрати наш об’єкт за допомогою циклу, він несподіванонеотримає доступ до символьних властивостей.
[Object.keys(user)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) також ігнорує їх. Це частина загального принципу "приховування символьних властивостей". Якщо інший скрипт або бібліотека спробує перебрати наш об’єкт за допомогою циклу,то ситуації коливін несподівано отримає доступ до символьних властивостей не станеться.
А ось, [Object.assign](mdn:js/Object/assign)копіюєвластивостірядка та символу:
А ось, [Object.assign](mdn:js/Object/assign)скопіює івластивостіпідписані рядком, і властивості підписані символом:
```js run
let id = Symbol("id");
Expand All
@@ -187,22 +187,22 @@ let clone = Object.assign({}, user);
alert( clone[id] ); // 123
```
Тут немаєпарадокса. Саме так задумано. Ідея полягає в тому, що коли ми клонуємо об’єкт або об’єднуємо об’єкти, ми зазвичай хочемо скопіювати *всі* властивості (включаючи властивості з ключами-символами, як, наприклад `id` з прикладу вище).
Тут немаєпарадоксу. Саме так задумано. Ідея полягає в тому, що коли ми клонуємо об’єкт або об’єднуємо об’єкти, ми зазвичай хочемо скопіювати *всі* властивості (включаючи властивості з ключами-символами, як, наприклад `id` з прикладу вище).
## Глобальні символи
Як ми вже бачили, зазвичай усі символи унікальні, навіть якщо вони мають однакову назву. Але іноді ми хочемо, щоб однойменні символи були однаковими сутностями. Наприклад, різні частини нашого додатка хочуть отримати доступ до символу `"id"`, що означає абсолютно однакову властивість.
Для цього існує *глобальний реєстр символів*. Ми можемо створити в ньому символи та отримати до них доступ пізніше, і це гарантує, що повторні звернення з тим самим іменем нам повернуть абсолютно однаковий символ.
Для того, щоб знайти (створити, якщо його немає) символ у реєстрі, використовуйте `Symbol.for(key)`.
Для того, щоб знайти (абостворити, якщо його немає) символ у реєстрі, використовуйте `Symbol.for(key)`.
Цей виклик перевіряє глобальний реєстр, і якщо є символ з іменем `key`, тоді повертає його, інакше створює новий символ `Symbol(key)` і зберігає його в реєстрі за вказаним `key`.
Наприклад:
```js run
// шукаємо вглобального реєстрі
// шукаємо вглобальному реєстрі
let id = Symbol.for("id"); // якщо такого символу немає, він буде створений
// шукаємо знову, але присвоюємо в іншу змінну (можливо в іншій частині коду)
Для глобальних символів, не тільки`Symbol.for(key)` повертає символ за іменем, також існує протилежний метод: `Symbol.keyFor(sym)`, який працює навпаки: приймає глобальний символ і повертає його ім’я.
Ми побачили, що для глобальних символів`Symbol.for(key)` повертає символ, якому належить вказане ім'я `key`. Якщо ми хочемо зробити зворотнє, тобто якщо ми хочемо знайти ім'я, яке належить символу `sym` - ми можемо використати `Symbol.keyFor(sym)`:
Наприклад:
Expand All
@@ -236,9 +236,9 @@ alert( Symbol.keyFor(sym) ); // name
alert( Symbol.keyFor(sym2) ); // id
```
`Symbol.keyFor` внутрішньо використовує глобальний реєстр символів для пошуку ключа символу. Тож це не працює дляне глобальних символів. Якщо символ не глобальний,він не зможе його знайти та поверне нам `undefined`.
`Symbol.keyFor` внутрішньо використовує глобальний реєстр символів для пошуку ключа символу. Тож це не працює дляНЕ глобальних символів. Якщо символ не глобальний,`Symbol.keyFor` не зможе його знайти та поверне нам `undefined`.
Проте, будь-які символи мають властивість `description`.
Тим не менш, всі символи мають властивість `description`.
Наприклад:
Expand All
@@ -264,7 +264,7 @@ alert( localSymbol.description ); // name
- `Symbol.toPrimitive`
- ...та інші.
До прикладу, `Symbol.toPrimitive` дозволяє описати правила дляоб’єктадо примітивного перетворення. Ми побачимо його використання дуже скоро.
До прикладу, `Symbol.toPrimitive` дозволяє описатиперетворенняоб’єктав примітив. Ми побачимо його використання дуже скоро.
З іншими системними символами познайомимось ближче, коли ми будемо вивчати відповідні мовні особливості.
Expand All
@@ -274,7 +274,7 @@ alert( localSymbol.description ); // name
Символ створюється за допомогою виклику `Symbol()` з необов’язковим описом (ім’я).
Символи--завжди унікальні, навіть якщо вони мають однакову назву. Якщо ми хочемо, щободнойменнісимволи були рівними за значенням, тоді слід використовувати глобальний реєстр: `Symbol.for(key)` повертає (створює за потреби) глобальний символ з ім’ям `key`. Декілька викликів `Symbol.for` з тією ж `key` повертає той самий символ.
Символи завжди унікальні, навіть якщо вони мають однакову назву. Якщо ми хочемо, щободнаково названісимволи були рівними за значенням, тоді слід використовувати глобальний реєстр: `Symbol.for(key)` повертає (або за потреби створює) глобальний символ з ім’ям `key`. Декілька викликів `Symbol.for` з тією ж `key` повертає той самий символ.
Символи мають два основних варіанти використання:
Expand Down
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.