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
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/09-object-toprimitive/article.md
+24-24Lines changed: 24 additions & 24 deletions
Original file line number
Diff line number
Diff line change
@@ -91,15 +91,15 @@ JavaScript не дозволяє налаштувати те, як працюю
91
91
92
92
**Щоб зробити перетворення, JavaScript намагається знайти та викликати три методи об’єкта:**
93
93
94
-
1.Викликати метод `obj[Symbol.toPrimitive](hint)` (це такий метод з символьним ключем`Symbol.toPrimitive`(системний символ)), якщо в цього об'єкта такий метод існує,
94
+
1.Намагається викликати метод `obj[Symbol.toPrimitive](hint)` (це такий метод з системним символом`Symbol.toPrimitive`в якості символьного ключа), якщо в цього об'єкта такий метод існує,
95
95
2. Інакше, якщо підказка має значення `"string"`
96
-
-спробує викликати `obj.toString()` або `obj.valueOf()` -- залежно від того, який з цих методів наявний для конкретного об'єкта.
96
+
-намагається викликати `obj.toString()` або `obj.valueOf()` -- залежно від того, який з цих методів існує в конкретного об'єкта.
97
97
3. Або, якщо підказка має значення `"number"` або `"default"`
98
-
- спробує викликати `obj.valueOf()` або `obj.toString()` -- залежно від того, який з цих методів наявний для конкретного об'єкта.
98
+
- спробує викликати `obj.valueOf()` або `obj.toString()` -- залежно від того, який з цих методів існує в конкретного об'єкта.
99
99
100
100
## Symbol.toPrimitive
101
101
102
-
Почнемо з першого методу. Є вбудований символ під назвою `Symbol.toPrimitive`, який слід використовувати щоб назвати метод перетворення, як, наприклад:
102
+
Почнемо з першого методу. Є вбудований символ під назвою `Symbol.toPrimitive`, який слід використовувати в якості ключа методу перетворення, як, наприклад:
alert(user +500); // виведе 'hint: default' і поверне 1500
131
131
```
132
132
133
-
Як ми бачимо з коду, `user` стає самоописуючим рядком або грошовою сумою в залежності від способу перетворення. Один метод `[Symbol.toPrimitive]` об’єкту`user` обробляє всі випадки перетворення.
133
+
Як ми бачимо з коду, `user` стає самоописуючим рядком або грошовою сумою в залежності від способу перетворення. Один єдиний метод `[Symbol.toPrimitive]` об’єкта`user` обробляє всі випадки перетворення.
134
134
135
135
## toString/valueOf
136
136
137
-
Якщо немає `Symbol.toPrimitive` тоді JavaScript намагається знайти хоча б якийсь з методів`toString` і `valueOf`:
137
+
Якщо немає `Symbol.toPrimitive` тоді JavaScript намагається знайти методи`toString` і `valueOf`:
138
138
139
-
- Якщо підказка має значення `"string"`: JavaScript спершу спробує виклика метод `toString`, і якщо в цього об'єкта цей метод не існує або якщо він повертає об'єкт замість примітивного значення, тоді викличе `valueOf` (таким чином, при перетворенні об'єкта в рядок пріоритет має `toString`).
140
-
- Якщо підказка має значення `"number"`/`"default"`, JavaScript спершу спробує викликати `valueOf`, і якщо цей метод в цього об'єкта не існує або якщо він повертає об'єкт замість примітивного значення, тоді викличе `toString` (таким чином, для математичних дій пріоритет має `valueOf`).
139
+
- Якщо підказка має значення `"string"`: JavaScript спершу спробує викликати метод `toString`, і якщо в цього об'єкта цей метод відсутній або якщо якщо цей метод повертає об'єкт замість примітивного значення, тоді JavaScript викличе `valueOf` (таким чином, при перетворенні об'єкта в рядок пріоритет має `toString`).
140
+
- Якщо підказка має значення `"number"`/`"default"`, JavaScript спершу спробує викликати `valueOf`, і якщо цей метод відсутній або якщо якщо цей метод повертає об'єкт замість примітивного значення, тоді JavaScript викличе `toString` (таким чином, для математичних дій пріоритет має `valueOf`).
141
141
142
-
Методи `toString` і `valueOf` походять з стародавніх часів. Вони не є символами (багато років назад символи не існували), а скоріше є "звичними" методами, що названі за допомогою рядків. Вони надають альтернативний «старомодний» спосіб реалізації перетворення.
142
+
Методи `toString` і `valueOf` походять з стародавніх часів. Вони не є символами (багато років назад символів в JavaScript не існувало), а скоріше є "звичними" методами, що названі за допомогою рядків. Вони надають альтернативний «старомодний» спосіб реалізації перетворення.
143
143
144
144
Ці методи повинні повертати примітивне значення. Якщо `toString` чи `valueOf` повертає об’єкт, то цей метод ігнорується (так само, якби цього методу не існувало).
145
145
146
-
За замовчуванням, в звичайного об'єкта є методи `toString` та `valueOf`. І працюють вони наступним чином:
146
+
В звичайного об'єкта методи `toString` та `valueOf` присутні за замовчуванням. І за замовчуванням вони вони працюють наступним чином:
147
147
148
148
- Метод `toString` повертає рядок `"[object Object]"`.
Отже, якщо ми спробуємо використовувати об’єкт як рядок, наприклад в `alert` та ін., то за замовчуванням ми побачимо `[object Object]`.
161
161
162
-
Вбудований метод `valueOf` згадується тут лише заради повноти картини, щоб уникнути будь-якої плутанини. Як бачите, він повертає сам об’єкт. А тому JavaScript його ігнорує. Не питайте мене чому так. Просто так склалось з історичних причин. Власне ми можемо припустити, що його не існує.
162
+
Вбудований метод `valueOf` згадується тут лише заради повноти картини, щоб уникнути непорозумінь. Бо JavaScript цей метод ігнорує. Ігнорує, бо як бачите, цей метод повертає сам об’єкт. Не питайте мене чому так. Просто так склалось з історичних причин. Власне ми можемо уявити ніби об'єкта `valueOf` не існує.
163
163
164
-
Давайте реалізуємо ці методи, щоб налаштувати перетворення.
164
+
Давайте самостійно реалізуємо ці методи, щоб налаштувати перетворення.
165
165
166
-
Наприклад, тут `user`робить те ж саме, що й вище, використовуючи комбінацію `toString` і `valueOf` замість `Symbol.toPrimitive`:
166
+
Наприклад, тут `user`при перетворенні стає тим самим, що й в прикладі вище, але цього разу використовуючи комбінацію `toString` і `valueOf` замість `Symbol.toPrimitive`:
### Перетворення може повернути будь-який примітивний тип
210
210
211
-
Важливо знати, що методи перетворення примітивів не обов’язково повертають "підказаний" примітив.
211
+
Важливо знати, що методи перетворення примітивів не обов’язково повертають примітив "підказаного" типу.
212
212
213
213
JavaScript не вимагає від `toString` повернути саме рядок якщо підказка має значення `"string"`. І не вимагає від `Symbol.toPrimitive` повернути число якщо підказка має значення `"number'`.
214
214
215
-
Єдина вимога до методів перетворення примітивів: ці методи повинні повертати примітивний тип, а не об’єкт.
215
+
Єдина вимога до методів перетворення примітивів: ці методи повинні повертати саме примітивний тип, а не об’єкт.
216
216
217
217
```smart header="Історичні нотатки"
218
-
З історичних причин, якщо `toString` чи `valueOf` поверне об’єкт, це не призведе до помилки, але таке значення буде проігнороване (так само, якби цей метод не існував). Воно не призведе до помилки лише тому, що в давнину JavaScript не вмів нормально видавати помилки.
218
+
З історичних причин, якщо `toString` чи `valueOf` поверне об’єкт, це не призведе до помилки. Таке значення буде просто проігнороване (так само, якби цей метод не існував). Воно не призведе до помилки лише тому, що в давнину JavaScript не вмів нормально видавати помилки.
219
219
220
220
Але, вимоги до `Symbol.toPrimitive` суворіші. Він *мусить* повернути примітив, інакше JavaScript видасть помилку.
221
221
```
@@ -241,10 +241,10 @@ let obj = {
241
241
alert(obj *2); // 4, бо спершу об’єкт перетворено на примітив "2", а тоді множенням отримано число
242
242
```
243
243
244
-
1. Множення `obj * 2` спочатку перетворює об’єкт в примітив (це рядок `"2"`).
245
-
2. Тоді `"2" * 2`стає`2 * 2` (рядок перетворюється на число).
244
+
1. Множення `obj * 2` спочатку перетворює об’єкт в примітив (вийде рядок `"2"`).
245
+
2. Тоді `"2" * 2`стане`2 * 2` (рядок перетворюється на число).
246
246
247
-
Бінарний плюс натомість, в точно такій же ситуації буде приймати рядки, оскільки він без проблем приймає рядки:
247
+
Бінарний плюс натомість, в точно такій же ситуації буде з радістю приймати рядки, оскільки він вміє працювати не лише з числами, а й з рядками:
248
248
249
249
```js run
250
250
let obj = {
@@ -265,16 +265,16 @@ alert(obj + 2); // 22 ("2" + 2), перетворення до примітив
265
265
-`"number"` (для математичних операцій)
266
266
-`"default"` (для дуже небагатьох операторів; зазвичай об’єкти реалізують це так само як і `"number"`.)
267
267
268
-
Специфікація явно описує, який оператор використовує яку підказку.
268
+
Специфікація явно описує який оператор використовує яку підказку.
269
269
270
270
Алгоритм перетворення наступний:
271
271
272
-
1. Викликати `obj[Symbol.toPrimitive](hint)`, якщо цей метод в цього об'єкта існує,
272
+
1. Викликати `obj[Symbol.toPrimitive](hint)` (якщо цей метод в цього об'єкта існує),
273
273
2. Інакше, якщо підказка має значення `"string"`
274
274
- спробувати викликати `obj.toString()` або `obj.valueOf()`, залежно від того, який з цих методів в цього об'єкта існує.
275
-
3. Інакше, якщо підказка -- має значення `"number"` чи `"default"`
275
+
3. Інакше, якщо підказка має значення `"number"` чи `"default"`
276
276
- спробувати викликати `obj.valueOf()` або `obj.toString()`, залежно від того, який з цих методів в цього об'єкта існує.
277
277
278
-
Усі ці методи мусять повертати примітив (якщо це визначено).
278
+
Виклик усіх цих методів повинен повертати примітив (якщо ці методи визначені).
279
279
280
-
На практиці часто достатньо реалізувати лише `obj.toString()` як універсальний метод для перетворення рядків, який повинен повернути "читабельне для людини" представлення об’єкта, для цілей логування або пошуку помилок.
280
+
На практиці часто достатньо реалізувати лише `obj.toString()` як універсальний метод для перетворення рядків, який повинен повернути "читабельне для людини" представлення об’єкта для цілей логування або пошуку помилок.
0 commit comments