aboutsummaryrefslogtreecommitdiff
path: root/files/uk/glossary/symbol/index.html
blob: da8ea9c366384a5aa82e43d63a11410d694293a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
---
title: Символ
slug: Glossary/Symbol
tags:
  - ECMAScript2015
  - JavaScript
  - Sharing
  - Символ
  - Словник
  - Тип даних
translation_of: Glossary/Symbol
original_slug: Glossary/Символ
---
<p>У {{Glossary("JavaScript")}}, символ (Symbol) є {{Glossary("Primitive", "простим типом даних")}}.</p>

<p>Значення типу <strong>символ</strong> також називають "Символьним значенням". У середовищі виконання JavaScript символьне значення створюється викликом функції {{jsxref("Symbol")}}, яка динамічно створює анонімне, унікальне значення. Символ можна використовувати як властивість об'єкта.</p>

<p>Символ може мати необов'язковий опис, але тільки для відлагодження.</p>

<p><strong>Символьне значення</strong> є унікальним ідентифікатором. Наприклад,</p>

<pre class="brush: js notranslate">// Ось два символи з однаковим описом,
let Sym1 = Symbol("Sym");
let Sym2 = Symbol("Sym");

console.log(Sym1 == Sym2); // повертає "false"
// Символи гарантовано є унікальними.
// Навіть якщо ми створимо багато символів з тим самим описом,
// вони будуть різними значеннями.</pre>

<div class="blockIndicator note">
<p><strong>Заувага</strong>: Якщо ви знайомі з Ruby чи іншою мовою, що має свій аналог “символів” – будь ласка, не плутайте. Символи JavaScript інші.</p>
</div>

<p>Символьний тип - це новий функціонал у ECMAScript 2015, і він не має еквіваленту у ECMAScript 5.</p>

<p>У деяких мовах програмування символьний тип даних також називається "атом".</p>

<h3 id="Символи_не_мають_автоматичного_перетворення_у_рядки">Символи не мають автоматичного перетворення у рядки</h3>

<p>Більшість значень у JavaScript підтримують неявне перетворення у рядки. Наприклад, ми можемо викликати <code>alert</code> майже з будь-яким значенням, і це спрацює. Символи особливі. Вони не перетворюються автоматично.</p>

<p>Наприклад,</p>

<pre class="brush: js notranslate">let Sym = Symbol("Sym");
alert(Sym); // TypeError: Cannot convert a Symbol value to a string</pre>

<p>Це “мовний захист” від плутанини, тому що рядки та символи є фундаментально різними, і не повинні випадково перетворюватись один на одного.</p>

<p>Якщо нам дуже потрібно вивести символ, треба викликати на ньому метод <code>.toString()</code>.</p>

<pre class="brush: js notranslate">let Sym = Symbol("Sym");

alert(Sym.toString()); // Symbol(Sym), тепер це працює</pre>

<p>Або ми можемо скористатись властивістю символу <code><em>symbol</em>.description</code>, щоб дістати його опис, наприклад,</p>

<pre class="brush: js notranslate">let _Sym = Symbol("Sym");

alert(_Sym.description); // Sym</pre>

<h3 id="Добревідомі_символи">Добревідомі символи</h3>

<p>Клас {{jsxref("Symbol")}} має константи для так званих добревідомих символів (<em>well-known symbols</em>). Ці символи дозволяють налаштовувати взаємодію JS з об'єктом, використовуючи їх в якості ключів.</p>

<p>Прикладами добревідомих символів є: {{jsxref("Symbol.iterator")}} для подібних до масивів об'єктів, або {{jsxref("Symbol.search")}} для рядкових об'єктів.</p>

<p>Вони наведені у таблиці специфікації <a href="https://tc39.github.io/ecma262/#sec-well-known-symbols">Добревідомі символи</a>:</p>

<ul>
 <li><code>Symbol.hasInstance</code></li>
 <li><code>Symbol.isConcatSpreadable</code></li>
 <li><code>Symbol.iterator</code></li>
 <li><code>Symbol.toPrimitive</code></li>
 <li>…і так далі.</li>
</ul>

<h3 id="Глобальний_реєстр_символів">Глобальний реєстр символів</h3>

<p>Методами, що мають доступ до глобального реєстру символів, є {{jsxref("Symbol.for()")}} і {{jsxref("Symbol.keyFor()")}}; це посередники між глобальною таблицею (або "реєстром") символів та середовищем виконання. Реєстр символів переважно збудований інфраструктурою компілятора Javascript, а вміст реєстру символів не доступний для інфраструктури виконання Javascript, окрім як за допомогою цих методів.</p>

<p>Метод <em><code>Symbol.for(tokenString)</code></em> повертає символьне значенняз реєстру, а <em><code>Symbol.keyFor(symbolValue)</code></em> повертає рядковий токен з реєстру; ці функції зворотні одна одній, тому наступне є істиною:</p>

<pre class="brush: js notranslate">Symbol.keyFor(Symbol.for("tokenString")) === "tokenString" // true</pre>

<h2 id="Дізнайтеся_більше">Дізнайтеся більше</h2>

<h3 id="Загальні_знання">Загальні знання</h3>

<ul>
 <li><a href="https://en.wikipedia.org/wiki/Symbol_(programming)">Symbol (programming)</a> на Вікіпедії</li>
 <li><a href="/uk/docs/Web/JavaScript/Data_structures">Типи та структури даних у JavaScript</a></li>
 <li><a href="http://2ality.com/2014/12/es6-symbols.html">Символи у ECMAScript 6</a></li>
 <li>{{jsxref("Symbol")}} у довідці MDN з JS</li>
 <li>{{jsxref("Object.getOwnPropertySymbols()")}}</li>
</ul>

<section id="Quick_Links">
<ul>
 <li><a href="/uk/docs/Glossary">Словник MDN Web Docs</a>

  <ul>
   <li>{{Glossary("JavaScript")}}</li>
   <li>{{Glossary("Primitive","Простий тип даних")}}</li>
  </ul>
 </li>
 <li>{{jsxref("Symbol")}}</li>
</ul>
</section>