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
Якщо немає `Symbol.toPrimitive` тоді JavaScript намагається знайти методи `toString` і `valueOf`:
138
138
139
-
-Для `"string"` підказка: виклик методу `toString`, і якщо цей метод не існує або якщо він повертає об'єкт замість примітивного значення, то викликати `valueOf` (таким чином `toString` має пріоритет при перетворенні в рядок).
140
-
- Для інших підказок: `valueOf`, і якщо це не існує або якщо він повертає об'єкт замість примітивного значення, то `toString` (таким чином `valueOf` має пріоритет для математики).
139
+
-Підказка для `"string"`: виклик методу `toString`, і якщо цей метод не існує або якщо він повертає об'єкт замість примітивного значення, тоді викликати `valueOf` (таким чином `toString` має пріоритет при перетворенні в рядок).
140
+
- Для інших підказок: `valueOf`, і якщо це не існує або якщо він повертає об'єкт замість примітивного значення, тоді викликати `toString` (таким чином `valueOf` має пріоритет для математичних дій).
141
141
142
-
Методи `toString` і `valueOf` походять з давніх часів. Вони не є символами (багато часу назад символи не існували), а скоріше є "звичними" методами, що названі за допомогою рядків. Вони забезпечують альтернативний шлях "старого стилю" для реалізації перетворення.
142
+
Методи `toString` і `valueOf` походять з давніх часів. Вони не є символами (багато часу назад символи не існували), а скоріше є "звичайними" методами, що названі за допомогою рядків. Вони надають альтернативний «старомодний» спосіб реалізації перетворення.
143
143
144
144
Ці методи повинні повертати примітивне значення. Якщо `toString` чи `valueOf` повертає об’єкт, то він ігнорується (так само, якби цього методу не існувало).
145
145
146
-
За замовчуванням, простий об’єкт має слідувати методами`toString` та `valueOf`:
146
+
За замовчуванням, звичайний об’єкт має наступні методи`toString` та `valueOf`:
147
147
148
148
- Метод `toString` повертає рядок `"[object Object]"`.
Отже, якщо ми спробуємо використовувати об’єкт як рядок, наприклад в `alert` та ін., то за замовчуванням ми бачимо`[object Object]`.
160
+
Отже, якщо ми спробуємо використовувати об’єкт як рядок, наприклад в `alert` та ін., то за замовчуванням ми побачимо`[object Object]`.
161
161
162
-
За замовчуванням метод `valueOf` згадується тут лише заради повноти, щоб уникнути будь-якої плутанини. Як ви бачите, він повертає сам об’єкт, і тому ігнорується. Не питайте мене, чому це для історичних причин. Тому ми можемо припустити, що цього не існує.
162
+
За замовчуванням метод `valueOf` згадується тут лише заради повноти картини, щоб уникнути будь-якої плутанини. Як бачите, він повертає сам об’єкт, і тому ігнорується з історичних причин. Тож ми можемо припустити, що його не існує.
163
163
164
-
Реалізуємо ці методи для налаштування перетворення.
164
+
Давайте реалізуємо ці методи, щоб налаштувати перетворення.
165
165
166
166
Наприклад, тут `user` робить те ж саме, що й вище, використовуючи комбінацію `toString` і `valueOf` замість `Symbol.toPrimitive`:
Як ми бачимо, поведінка така ж, як і в попередньому прикладі з `Symbol.toPrimitive`.
190
+
Як бачимо, поведінка така ж, як і в попередньому прикладі з `Symbol.toPrimitive`.
191
191
192
-
Часто ми хочемо, щоб в одному місці перехоплювалися та оброблялися всі перетворення в примітиви. У цьому випадку ми можемо реалізувати `toString`, як, наприклад:
192
+
Часто нам потрібне єдине «універсальне» місце для обробки всіх перетворень примітивів. У цьому випадку ми можемо реалізувати тільки `toString`, ось так:
193
193
194
194
```js run
195
195
let user = {
@@ -204,29 +204,29 @@ alert(user); // toString -> Іван
204
204
alert(user +500); // toString -> Іван500
205
205
```
206
206
207
-
За відсутності `Symbol.toPrimitive` і `valueOf`, `toString` буде обробляти всі примітивні перетворення.
207
+
За відсутності `Symbol.toPrimitive` і `valueOf`, `toString` буде обробляти всі перетворення примітивів.
208
208
209
209
### Перетворення може повернути будь-який примітивний тип
210
210
211
-
Важливо знати про всі методи примітивні перетворення те, що вони не обов’язково повертають "підказаний" примітив.
211
+
Важливо знати про всі методи перетворення примітивів, що вони не обов’язково повертають "підказаний" примітив.
212
212
213
-
Немає контролю, чи повертає `toString` саме рядок, або чи `symbol.toprimitive` метод повертає номер для підказки `"number"`.
213
+
Немає контролю, чи повертає `toString` саме рядок, або чи `symbol.toprimitive` метод повертає число для підказки `"number"`.
214
214
215
215
Єдина обов’язкова річ: ці методи повинні повертати примітивний тип, а не об’єкт.
216
216
217
217
```smart header="Історичні нотатки"
218
-
З історичних причин, якщо `toString` чи `valueOf` повертає об’єкт. В цьому немає помилки, але таке значення ігнорується (так само, якби цей метод не існував). Це тому, що в давнину в JavaScript не було хорошого концепту "помилка".
218
+
З історичних причин, якщо `toString` чи `valueOf` повертає об’єкт,це не є помилкою, але таке значення ігнорується (так само, якби цей метод не існував). Це тому, що в давнину в JavaScript не було хорошого концепту "помилка".
219
219
220
-
Навпаки, `Symbol.toPrimitive` *повинен* повернути примітив, інакше буде помилка.
220
+
На противагу цьому, `Symbol.toPrimitive` суворіший, він *повинен* повернути примітив, інакше буде помилка.
221
221
```
222
222
223
223
## Подальші перетворення
224
224
225
-
Як ми вже знаємо, багато операторів та функцій виконують перетворення типу, наприклад, множення `*` перетворює операнди в цифри.
225
+
Як ми вже знаємо, багато операторів та функцій виконують перетворення типів, наприклад, множення `*` перетворює операнди в числа.
226
226
227
-
Якщо ми передамо об’єкт як аргумент, то є два етапи:
227
+
Якщо ми передамо об’єкт як аргумент, то відбувається два етапи обчислень:
228
228
1. Об’єкт перетворюється на примітив (використовуючи правила, описані вище).
229
-
2. Якщо отриманий примітив не є правильним типом, він перетворюється.
229
+
2. Якщо це необхідно для подальших обчислень, то отриманий примітив також перетворюється.
230
230
231
231
Наприклад:
232
232
@@ -238,13 +238,13 @@ let obj = {
238
238
}
239
239
};
240
240
241
-
alert(obj *2); // 4, об’єкт перетворився на примітив "2", потім множення зробило це числом
241
+
alert(obj *2); // 4, об’єкт перетворено на примітив "2", потім множенням отримано число
242
242
```
243
243
244
244
1. Множення `obj * 2` спочатку перетворює об’єкт в примітив (це рядок `"2"`).
245
-
2. Тоді `"2" * 2` стає `2 * 2` (рядок перетворюється на номер).
245
+
2. Тоді `"2" * 2` стає `2 * 2` (рядок перетворюється на число).
246
246
247
-
Бінарний плюс буде об’єднувати рядки в такій же ситуації, оскільки він приймає рядки:
247
+
Бінарний плюс буде об’єднувати рядки в такій же ситуації, оскільки він з радістю приймає рядки:
248
248
249
249
```js run
250
250
let obj = {
@@ -258,23 +258,23 @@ alert(obj + 2); // 22 ("2" + 2), перетворення до примітив
258
258
259
259
## Підсумки
260
260
261
-
Об’єктно-примітивне перетворення викликається автоматично багатьма вбудованими функціями та операторами, які очікують примітиву як значення.
261
+
Перетворення об’єкта на примітив викликається автоматично багатьма вбудованими функціями та операторами, які очікують примітив як значення.
262
262
263
-
Є 3 типи (підказки) цього:
263
+
Існує 3 типи (підказки) цього перетворення:
264
264
-`"string"` (для `alert` та інших операцій, які потребують рядка)
265
265
-`"number"` (для математичних операцій)
266
-
-`"default"` (кілька операторів, зазвичай об’єкти реалізують це так само як і `"number"`.)
266
+
-`"default"` (мало операторів, зазвичай об’єкти реалізують це так само як і `"number"`.)
267
267
268
268
Специфікація явно описує, який оператор використовує яку підказку.
269
269
270
-
Алгоритм перетворення це:
270
+
Алгоритм перетворення наступний:
271
271
272
272
1. Викликати `obj[Symbol.toPrimitive](hint)`, якщо метод існує,
273
-
2. Інакше, якщо підказка -- це`"string"`
274
-
- спробувати `obj.toString()` або `obj.valueOf()`, залежно від того, що існує.
275
-
3. Інакше, якщо підказка -- це`"number"` чи `"default"`
276
-
- спробувати `obj.valueOf()` або `obj.toString()`, залежно від того, що існує.
273
+
2. Інакше, якщо підказка -- має значення`"string"`
274
+
- спробувати викликати `obj.toString()` або `obj.valueOf()`, залежно від того, що існує.
275
+
3. Інакше, якщо підказка -- має значення`"number"` чи `"default"`
276
+
- спробувати викликати `obj.valueOf()` або `obj.toString()`, залежно від того, що існує.
277
277
278
-
Усі ці методи повинні повернути примітив до роботи (якщо визначені).
278
+
Усі ці методи повинні повертати примітив (якщо визначені).
279
279
280
-
На практиці досить часто для реалізації достатньо лише `obj.toString()` як універсального методу для перетворення рядків, який повинен повернути "читабельне для людини" представлення об’єкта, для цілей логування або пошуку помилок.
280
+
На практиці часто достатньо реалізувати лише `obj.toString()` як універсальний метод для перетворення рядків, який повинен повернути "читабельне для людини" представлення об’єкта, для цілей логування або пошуку помилок.
0 commit comments