URL: http://github.com/javascript-tutorial/uk.javascript.info/pull/700.patch
сних випадках, коли оператор "не впевнений", який тип очікується. +: Трапляється в рідкісних випадках, коли оператор "не впевнений", який тип очікувати. - Наприклад, бінарний плюс `+` може працювати як з рядками (об’єднує їх), так і з цифрами (додає їх), тому обидва випадки -- рядки та цифри -- будуть працювати. Отже, якщо бінарний плюс отримує об’єкт як аргумент, він використовує підказку `"default"` для його перетворення. + Наприклад, бінарний плюс `+` може працювати як з рядками (об’єднує їх), так і з цифрами (додає їх), тому обидва випадки -- і рядки, і цифри -- будуть працювати. Отже, якщо бінарний плюс отримує об’єкт як аргумент, він використовує підказку `"default"` для його перетворення. - Також, якщо об’єкт порівнюється за допомогою (`==`) з рядком, числом чи символом, також незрозуміло, яке перетворення слід виконати, тому використовується підказка `"default"`. + Також, якщо об’єкт порівнюється за допомогою (`==`) з рядком, числом або символом, то також незрозуміло, яке перетворення слід виконати, тому використовується підказка `"default"`. ```js // бінарний плюс використовує підказку "default" @@ -81,37 +81,37 @@ JavaScript не дозволяє налаштувати те, як працюю if (user == 1) { ... }; ``` - Оператори порівняння більше та менше, такі як `<` `>`, також можуть працювати як з рядками, так і з числами. Проте, вони з історичних причин використовують підказку `"number"` , а не `"default"`. + Оператори порівняння більше та менше, такі як `<` `>`, також можуть працювати як з рядками, так і з числами. Проте, вони з історичних причин використовують підказку `"number"` , а не підказку `"default"`. Але на практиці все трохи простіше. -Всі вбудовані об’єкти, крім одного випадку (об’єкт `Date`, ми дізнаємося пізніше) реалізовують перетворення `"default"` так само як `"number"`. І нам, мабуть, слід робити так само. +Всі вбудовані об’єкти, за винятком лише об’єкту `Date` (про який ми дізнаємося пізніше), реалізовують перетворення з підказкою `"default"` так само як з підказкою `"number"`. І нам, мабуть, слід робити так само. -Проте важливо знати про всі три підказки, незабаром ми побачимо, чому. +Проте важливо знати про всі три підказки і незабаром ми побачимо чому. -** Щоб зробити перетворення, JavaScript намагається знайти та викликати три методи об’єкта: ** +**Щоб зробити перетворення, JavaScript намагається знайти та викликати три методи об’єкта:** -1. Викликати `obj[Symbol.toPrimitive](hint)` -- метод з символьним ключем `Symbol.toPrimitive` (системний символ), якщо такий метод існує, -2. Інакше, якщо підказка - це `"string"` - - спробує викликати `obj.toString()` або `obj.valueOf()` -- залежно від того, що існує. -3. Інакше, якщо підказка має значення - `"число"` або `"default"` - - спробує викликати `obj.valueOf()` або `obj.toString()` -- залежно від того, що існує. +1. Викликати метод `obj[Symbol.toPrimitive](hint)` (це такий метод з символьним ключем `Symbol.toPrimitive` (системний символ)), якщо в цього об'єкта такий метод існує, +2. Інакше, якщо підказка має значення `"string"` + - спробує викликати `obj.toString()` або `obj.valueOf()` -- залежно від того, який з цих методів наявний для конкретного об'єкта. +3. Або, якщо підказка має значення `"number"` або `"default"` + - спробує викликати `obj.valueOf()` або `obj.toString()` -- залежно від того, який з цих методів наявний для конкретного об'єкта. ## Symbol.toPrimitive -Почнемо з першого методу. Є вбудований символ під назвою `Symbol.toPrimitive`, який слід використовувати для назви методу перетворення, як, наприклад: +Почнемо з першого методу. Є вбудований символ під назвою `Symbol.toPrimitive`, який слід використовувати щоб назвати метод перетворення, як, наприклад: ```js obj[Symbol.toPrimitive] = function(hint) { // тут йде код, щоб перетворити цей об’єкт в примітив // він повинен повернути примітивне значення - // hint = один з "string", "number", "default" + // в hint надходить або "string", або "number", або "default" }; ``` -Якщо метод `symbol.toPrimitive` існує, він використовується для всіх підказок, і не потрібно більше методів. +Якщо метод `symbol.toPrimitive` в конкретного об'єкта існує, він буде використовуватись для всіх підказок, і ніякі інші методи не потрібні. -Наприклад, тут об’єкт `user` реалізує його: +Наприклад, тут об’єкт `user` імплементує цей метод: ```js run let user = { @@ -125,25 +125,25 @@ let user = { }; // демонстрація перетворення: -alert(user); // hint: string -> {name: "Іван"} -alert(+user); // hint: number -> 1000 -alert(user + 500); // hint: default -> 1500 +alert(user); // виведе 'hint: string' і поверне '{name: "Іван"}' +alert(+user); // виведе 'hint: number' і поверне 1000 +alert(user + 500); // виведе 'hint: default' і поверне 1500 ``` -Як ми бачимо з коду, `user` стає само описаним рядком або грошовою сумою залежно від перетворення. Єдиний метод `[Symbol.toPrimitive]` об’єкту `user` обробляє всі випадки перетворення. +Як ми бачимо з коду, `user` стає самоописуючим рядком або грошовою сумою в залежності від способу перетворення. Один метод `[Symbol.toPrimitive]` об’єкту `user` обробляє всі випадки перетворення. ## toString/valueOf -Якщо немає `Symbol.toPrimitive` тоді JavaScript намагається знайти методи `toString` і `valueOf`: +Якщо немає `Symbol.toPrimitive` тоді JavaScript намагається знайти хоча б якийсь з методів `toString` і `valueOf`: -- Підказка для `"string"`: виклик методу `toString`, і якщо цей метод не існує або якщо він повертає об'єкт замість примітивного значення, тоді викликати `valueOf` (таким чином `toString` має пріоритет при перетворенні в рядок). -- Для інших підказок: `valueOf`, і якщо це не існує або якщо він повертає об'єкт замість примітивного значення, тоді викликати `toString` (таким чином `valueOf` має пріоритет для математичних дій). +- Якщо підказка має значення `"string"`: JavaScript спершу спробує виклика метод `toString`, і якщо в цього об'єкта цей метод не існує або якщо він повертає об'єкт замість примітивного значення, тоді викличе `valueOf` (таким чином, при перетворенні об'єкта в рядок пріоритет має `toString`). +- Якщо підказка має значення `"number"`/`"default"`, JavaScript спершу спробує викликати `valueOf`, і якщо цей метод в цього об'єкта не існує або якщо він повертає об'єкт замість примітивного значення, тоді викличе `toString` (таким чином, для математичних дій пріоритет має `valueOf`). -Методи `toString` і `valueOf` походять з давніх часів. Вони не є символами (багато часу назад символи не існували), а скоріше є "звичайними" методами, що названі за допомогою рядків. Вони надають альтернативний «старомодний» спосіб реалізації перетворення. +Методи `toString` і `valueOf` походять з стародавніх часів. Вони не є символами (багато років назад символи не існували), а скоріше є "звичними" методами, що названі за допомогою рядків. Вони надають альтернативний «старомодний» спосіб реалізації перетворення. -Ці методи повинні повертати примітивне значення. Якщо `toString` чи `valueOf` повертає об’єкт, то він ігнорується (так само, якби цього методу не існувало). +Ці методи повинні повертати примітивне значення. Якщо `toString` чи `valueOf` повертає об’єкт, то цей метод ігнорується (так само, якби цього методу не існувало). -За замовчуванням, звичайний об’єкт має наступні методи `toString` та `valueOf`: +За замовчуванням, в звичайного об'єкта є методи `toString` та `valueOf`. І працюють вони наступним чином: - Метод `toString` повертає рядок `"[object Object]"`. - Метод `valueOf` повертає сам об’єкт. @@ -159,7 +159,7 @@ alert(user.valueOf() === user); // true Отже, якщо ми спробуємо використовувати об’єкт як рядок, наприклад в `alert` та ін., то за замовчуванням ми побачимо `[object Object]`. -За замовчуванням метод `valueOf` згадується тут лише заради повноти картини, щоб уникнути будь-якої плутанини. Як бачите, він повертає сам об’єкт, і тому ігнорується з історичних причин. Тож ми можемо припустити, що його не існує. +Вбудований метод `valueOf` згадується тут лише заради повноти картини, щоб уникнути будь-якої плутанини. Як бачите, він повертає сам об’єкт. А тому JavaScript його ігнорує. Не питайте мене чому так. Просто так склалось з історичних причин. Власне ми можемо припустити, що його не існує. Давайте реалізуємо ці методи, щоб налаштувати перетворення. @@ -189,7 +189,7 @@ alert(user + 500); // valueOf -> 1500 Як бачимо, поведінка така ж, як і в попередньому прикладі з `Symbol.toPrimitive`. -Часто нам потрібне єдине «універсальне» місце для обробки всіх перетворень примітивів. У цьому випадку ми можемо реалізувати тільки `toString`, ось так: +Часто нам потрібне одне єдине «універсальне» місце для обробки всіх перетворень примітивів. У цьому випадку ми можемо реалізувати тільки `toString`, ось так: ```js run let user = { @@ -204,47 +204,47 @@ alert(user); // toString -> Іван alert(user + 500); // toString -> Іван500 ``` -За відсутності `Symbol.toPrimitive` і `valueOf`, `toString` буде обробляти всі перетворення примітивів. +Якщо відсутній `Symbol.toPrimitive` і `valueOf`, то всі перетворення примітивів буде обробляти `toString`. ### Перетворення може повернути будь-який примітивний тип -Важливо знати про всі методи перетворення примітивів, що вони не обов’язково повертають "підказаний" примітив. +Важливо знати, що методи перетворення примітивів не обов’язково повертають "підказаний" примітив. -Немає контролю, чи повертає `toString` саме рядок, або чи `symbol.toprimitive` метод повертає число для підказки `"number"`. +JavaScript не вимагає від `toString` повернути саме рядок якщо підказка має значення `"string"`. І не вимагає від `Symbol.toPrimitive` повернути число якщо підказка має значення `"number'`. -Єдина обов’язкова річ: ці методи повинні повертати примітивний тип, а не об’єкт. +Єдина вимога до методів перетворення примітивів: ці методи повинні повертати примітивний тип, а не об’єкт. ```smart header="Історичні нотатки" -З історичних причин, якщо `toString` чи `valueOf` повертає об’єкт,це не є помилкою, але таке значення ігнорується (так само, якби цей метод не існував). Це тому, що в давнину в JavaScript не було хорошого концепту "помилка". +З історичних причин, якщо `toString` чи `valueOf` поверне об’єкт, це не призведе до помилки, але таке значення буде проігнороване (так само, якби цей метод не існував). Воно не призведе до помилки лише тому, що в давнину JavaScript не вмів нормально видавати помилки. -На противагу цьому, `Symbol.toPrimitive` суворіший, він *повинен* повернути примітив, інакше буде помилка. +Але, вимоги до `Symbol.toPrimitive` суворіші. Він *мусить* повернути примітив, інакше JavaScript видасть помилку. ``` ## Подальші перетворення -Як ми вже знаємо, багато операторів та функцій виконують перетворення типів, наприклад, множення `*` перетворює операнди в числа. +Як ми вже знаємо, багато операторів та функцій виконують перетворення типів. Наприклад, множення `*` перетворює операнди в числа. Якщо ми передамо об’єкт як аргумент, то відбувається два етапи обчислень: -1. Об’єкт перетворюється на примітив (використовуючи правила, описані вище). -2. Якщо це необхідно для подальших обчислень, то отриманий примітив також перетворюється. +1. Об’єкт буде перетворено на примітив (використовуючи правила, описані вище). +2. Якщо це необхідно для подальших обчислень, то й отриманий примітив також буде перетворено. Наприклад: ```js run let obj = { - // toString обробляє всі перетворення за відсутності інших методів + // За відсутності інших методів, toString обробляє всі перетворення toString() { return "2"; } }; -alert(obj * 2); // 4, об’єкт перетворено на примітив "2", потім множенням отримано число +alert(obj * 2); // 4, бо спершу об’єкт перетворено на примітив "2", а тоді множенням отримано число ``` 1. Множення `obj * 2` спочатку перетворює об’єкт в примітив (це рядок `"2"`). 2. Тоді `"2" * 2` стає `2 * 2` (рядок перетворюється на число). -Бінарний плюс буде об’єднувати рядки в такій же ситуації, оскільки він з радістю приймає рядки: +Бінарний плюс натомість, в точно такій же ситуації буде приймати рядки, оскільки він без проблем приймає рядки: ```js run let obj = { @@ -260,21 +260,21 @@ alert(obj + 2); // 22 ("2" + 2), перетворення до примітив Перетворення об’єкта на примітив викликається автоматично багатьма вбудованими функціями та операторами, які очікують примітив як значення. -Існує 3 типи (підказки) цього перетворення: +Існує 3 типи (підказки) для цього перетворення: - `"string"` (для `alert` та інших операцій, які потребують рядка) - `"number"` (для математичних операцій) -- `"default"` (мало операторів, зазвичай об’єкти реалізують це так само як і `"number"`.) +- `"default"` (для дуже небагатьох операторів; зазвичай об’єкти реалізують це так само як і `"number"`.) Специфікація явно описує, який оператор використовує яку підказку. Алгоритм перетворення наступний: -1. Викликати `obj[Symbol.toPrimitive](hint)`, якщо метод існує, -2. Інакше, якщо підказка -- має значення `"string"` - - спробувати викликати `obj.toString()` або `obj.valueOf()`, залежно від того, що існує. +1. Викликати `obj[Symbol.toPrimitive](hint)`, якщо цей метод в цього об'єкта існує, +2. Інакше, якщо підказка має значення `"string"` + - спробувати викликати `obj.toString()` або `obj.valueOf()`, залежно від того, який з цих методів в цього об'єкта існує. 3. Інакше, якщо підказка -- має значення `"number"` чи `"default"` - - спробувати викликати `obj.valueOf()` або `obj.toString()`, залежно від того, що існує. + - спробувати викликати `obj.valueOf()` або `obj.toString()`, залежно від того, який з цих методів в цього об'єкта існує. -Усі ці методи повинні повертати примітив (якщо визначені). +Усі ці методи мусять повертати примітив (якщо це визначено). На практиці часто достатньо реалізувати лише `obj.toString()` як універсальний метод для перетворення рядків, який повинен повернути "читабельне для людини" представлення об’єкта, для цілей логування або пошуку помилок. From 2cfc33f0dca0efe8c3dafb8a26af99d4c0f59b38 Mon Sep 17 00:00:00 2001 From: Andrii HrushetskyiNote: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: