Skip to content

Commit 2cfc33f

Browse files
committed
fix 01-04-09 object-tostring
I've read this article again and made it's translation even better and even more clear for understanding.
1 parent 22d62ec commit 2cfc33f

File tree

1 file changed

+24
-24
lines changed
  • 1-js/04-object-basics/09-object-toprimitive

1 file changed

+24
-24
lines changed

1-js/04-object-basics/09-object-toprimitive/article.md

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,15 @@ JavaScript не дозволяє налаштувати те, як працюю
9191

9292
**Щоб зробити перетворення, JavaScript намагається знайти та викликати три методи об’єкта:**
9393

94-
1. Викликати метод `obj[Symbol.toPrimitive](hint)` (це такий метод з символьним ключем `Symbol.toPrimitive` (системний символ)), якщо в цього об'єкта такий метод існує,
94+
1. Намагається викликати метод `obj[Symbol.toPrimitive](hint)` (це такий метод з системним символом `Symbol.toPrimitive` в якості символьного ключа), якщо в цього об'єкта такий метод існує,
9595
2. Інакше, якщо підказка має значення `"string"`
96-
- спробує викликати `obj.toString()` або `obj.valueOf()` -- залежно від того, який з цих методів наявний для конкретного об'єкта.
96+
- намагається викликати `obj.toString()` або `obj.valueOf()` -- залежно від того, який з цих методів існує в конкретного об'єкта.
9797
3. Або, якщо підказка має значення `"number"` або `"default"`
98-
- спробує викликати `obj.valueOf()` або `obj.toString()` -- залежно від того, який з цих методів наявний для конкретного об'єкта.
98+
- спробує викликати `obj.valueOf()` або `obj.toString()` -- залежно від того, який з цих методів існує в конкретного об'єкта.
9999

100100
## Symbol.toPrimitive
101101

102-
Почнемо з першого методу. Є вбудований символ під назвою `Symbol.toPrimitive`, який слід використовувати щоб назвати метод перетворення, як, наприклад:
102+
Почнемо з першого методу. Є вбудований символ під назвою `Symbol.toPrimitive`, який слід використовувати в якості ключа методу перетворення, як, наприклад:
103103

104104
```js
105105
obj[Symbol.toPrimitive] = function(hint) {
@@ -130,20 +130,20 @@ alert(+user); // виведе 'hint: number' і поверне 1000
130130
alert(user + 500); // виведе 'hint: default' і поверне 1500
131131
```
132132

133-
Як ми бачимо з коду, `user` стає самоописуючим рядком або грошовою сумою в залежності від способу перетворення. Один метод `[Symbol.toPrimitive]` об’єкту `user` обробляє всі випадки перетворення.
133+
Як ми бачимо з коду, `user` стає самоописуючим рядком або грошовою сумою в залежності від способу перетворення. Один єдиний метод `[Symbol.toPrimitive]` об’єкта `user` обробляє всі випадки перетворення.
134134

135135
## toString/valueOf
136136

137-
Якщо немає `Symbol.toPrimitive` тоді JavaScript намагається знайти хоча б якийсь з методів `toString` і `valueOf`:
137+
Якщо немає `Symbol.toPrimitive` тоді JavaScript намагається знайти методи `toString` і `valueOf`:
138138

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`).
141141

142-
Методи `toString` і `valueOf` походять з стародавніх часів. Вони не є символами (багато років назад символи не існували), а скоріше є "звичними" методами, що названі за допомогою рядків. Вони надають альтернативний «старомодний» спосіб реалізації перетворення.
142+
Методи `toString` і `valueOf` походять з стародавніх часів. Вони не є символами (багато років назад символів в JavaScript не існувало), а скоріше є "звичними" методами, що названі за допомогою рядків. Вони надають альтернативний «старомодний» спосіб реалізації перетворення.
143143

144144
Ці методи повинні повертати примітивне значення. Якщо `toString` чи `valueOf` повертає об’єкт, то цей метод ігнорується (так само, якби цього методу не існувало).
145145

146-
За замовчуванням, в звичайного об'єкта є методи `toString` та `valueOf`. І працюють вони наступним чином:
146+
В звичайного об'єкта методи `toString` та `valueOf` присутні за замовчуванням. І за замовчуванням вони вони працюють наступним чином:
147147

148148
- Метод `toString` повертає рядок `"[object Object]"`.
149149
- Метод `valueOf` повертає сам об’єкт.
@@ -159,11 +159,11 @@ alert(user.valueOf() === user); // true
159159

160160
Отже, якщо ми спробуємо використовувати об’єкт як рядок, наприклад в `alert` та ін., то за замовчуванням ми побачимо `[object Object]`.
161161

162-
Вбудований метод `valueOf` згадується тут лише заради повноти картини, щоб уникнути будь-якої плутанини. Як бачите, він повертає сам об’єкт. А тому JavaScript його ігнорує. Не питайте мене чому так. Просто так склалось з історичних причин. Власне ми можемо припустити, що його не існує.
162+
Вбудований метод `valueOf` згадується тут лише заради повноти картини, щоб уникнути непорозумінь. Бо JavaScript цей метод ігнорує. Ігнорує, бо як бачите, цей метод повертає сам об’єкт. Не питайте мене чому так. Просто так склалось з історичних причин. Власне ми можемо уявити ніби об'єкта `valueOf` не існує.
163163

164-
Давайте реалізуємо ці методи, щоб налаштувати перетворення.
164+
Давайте самостійно реалізуємо ці методи, щоб налаштувати перетворення.
165165

166-
Наприклад, тут `user` робить те ж саме, що й вище, використовуючи комбінацію `toString` і `valueOf` замість `Symbol.toPrimitive`:
166+
Наприклад, тут `user` при перетворенні стає тим самим, що й в прикладі вище, але цього разу використовуючи комбінацію `toString` і `valueOf` замість `Symbol.toPrimitive`:
167167

168168
```js run
169169
let user = {
@@ -208,14 +208,14 @@ alert(user + 500); // toString -> Іван500
208208

209209
### Перетворення може повернути будь-який примітивний тип
210210

211-
Важливо знати, що методи перетворення примітивів не обов’язково повертають "підказаний" примітив.
211+
Важливо знати, що методи перетворення примітивів не обов’язково повертають примітив "підказаного" типу.
212212

213213
JavaScript не вимагає від `toString` повернути саме рядок якщо підказка має значення `"string"`. І не вимагає від `Symbol.toPrimitive` повернути число якщо підказка має значення `"number'`.
214214

215-
Єдина вимога до методів перетворення примітивів: ці методи повинні повертати примітивний тип, а не об’єкт.
215+
Єдина вимога до методів перетворення примітивів: ці методи повинні повертати саме примітивний тип, а не об’єкт.
216216

217217
```smart header="Історичні нотатки"
218-
З історичних причин, якщо `toString` чи `valueOf` поверне об’єкт, це не призведе до помилки, але таке значення буде проігнороване (так само, якби цей метод не існував). Воно не призведе до помилки лише тому, що в давнину JavaScript не вмів нормально видавати помилки.
218+
З історичних причин, якщо `toString` чи `valueOf` поверне об’єкт, це не призведе до помилки. Таке значення буде просто проігнороване (так само, якби цей метод не існував). Воно не призведе до помилки лише тому, що в давнину JavaScript не вмів нормально видавати помилки.
219219
220220
Але, вимоги до `Symbol.toPrimitive` суворіші. Він *мусить* повернути примітив, інакше JavaScript видасть помилку.
221221
```
@@ -241,10 +241,10 @@ let obj = {
241241
alert(obj * 2); // 4, бо спершу об’єкт перетворено на примітив "2", а тоді множенням отримано число
242242
```
243243

244-
1. Множення `obj * 2` спочатку перетворює об’єкт в примітив (це рядок `"2"`).
245-
2. Тоді `"2" * 2` стає `2 * 2` (рядок перетворюється на число).
244+
1. Множення `obj * 2` спочатку перетворює об’єкт в примітив (вийде рядок `"2"`).
245+
2. Тоді `"2" * 2` стане `2 * 2` (рядок перетворюється на число).
246246

247-
Бінарний плюс натомість, в точно такій же ситуації буде приймати рядки, оскільки він без проблем приймає рядки:
247+
Бінарний плюс натомість, в точно такій же ситуації буде з радістю приймати рядки, оскільки він вміє працювати не лише з числами, а й з рядками:
248248

249249
```js run
250250
let obj = {
@@ -265,16 +265,16 @@ alert(obj + 2); // 22 ("2" + 2), перетворення до примітив
265265
- `"number"` (для математичних операцій)
266266
- `"default"` (для дуже небагатьох операторів; зазвичай об’єкти реалізують це так само як і `"number"`.)
267267

268-
Специфікація явно описує, який оператор використовує яку підказку.
268+
Специфікація явно описує який оператор використовує яку підказку.
269269

270270
Алгоритм перетворення наступний:
271271

272-
1. Викликати `obj[Symbol.toPrimitive](hint)`, якщо цей метод в цього об'єкта існує,
272+
1. Викликати `obj[Symbol.toPrimitive](hint)` (якщо цей метод в цього об'єкта існує),
273273
2. Інакше, якщо підказка має значення `"string"`
274274
- спробувати викликати `obj.toString()` або `obj.valueOf()`, залежно від того, який з цих методів в цього об'єкта існує.
275-
3. Інакше, якщо підказка -- має значення `"number"` чи `"default"`
275+
3. Інакше, якщо підказка має значення `"number"` чи `"default"`
276276
- спробувати викликати `obj.valueOf()` або `obj.toString()`, залежно від того, який з цих методів в цього об'єкта існує.
277277

278-
Усі ці методи мусять повертати примітив (якщо це визначено).
278+
Виклик усіх цих методів повинен повертати примітив (якщо ці методи визначені).
279279

280-
На практиці часто достатньо реалізувати лише `obj.toString()` як універсальний метод для перетворення рядків, який повинен повернути "читабельне для людини" представлення об’єкта, для цілей логування або пошуку помилок.
280+
На практиці часто достатньо реалізувати лише `obj.toString()` як універсальний метод для перетворення рядків, який повинен повернути "читабельне для людини" представлення об’єкта для цілей логування або пошуку помилок.

0 commit comments

Comments
 (0)