diff --git a/1-js/05-data-types/03-string/article.md b/1-js/05-data-types/03-string/article.md index 4fe802c81..ab3eab996 100644 --- a/1-js/05-data-types/03-string/article.md +++ b/1-js/05-data-types/03-string/article.md @@ -87,7 +87,7 @@ alert(str1 == str2); // true Усі спеціальні символи починаються зі зворотного слеша `\`. Його також називають "символом екранування". -Оскільки це так особливо, якщо нам потрібно показати зворотний слеш `\` у рядку, нам потрібно подвоїти його: +Оскільки він не зовсім звичайний, то якщо нам потрібно показати зворотний слеш `\` у рядку, нам потрібно подвоїти його: ```js run alert( `Зворотний слеш: \\` ); // Зворотний слеш: \ @@ -101,9 +101,9 @@ alert( `Зворотний слеш: \\` ); // Зворотний слеш: \ alert( 'Ім*!*\'*/!*я моє — Морж!' ); // *!*Ім'я*/!* моє — Морж! ``` -Як бачите, ми повинні "екранувати" лапку зворотним слешем `\'`, оскільки інакше це означало б кінець рядка. +Як бачите, ми повинні "екранувати" лапку зворотним слешем `\'`, оскільки інакше ця лапка означала б кінець рядка. -Звісно, потрібно "екранувати" лише такі лапки, якими обрамлений рядок. Як елегантніше рішення, ми могли б замість цього скористатися подвійними або зворотними лапками: +Звісно ж, потрібно "екранувати" лише такі лапки, якими обрамлений рядок. Або ще елегантнішим рішенням було б якби ми замість цього скористалися подвійними або зворотними лапками: ```js run alert( `Ім'я моє — Морж!` ); // Ім'я моє — Морж! @@ -214,7 +214,7 @@ alert( 'Interface'[0].toLowerCase() ); // 'і' Перший метод -- [str.indexOf(substr, pos)](mdn:js/String/indexOf). -Він шукає підрядок `substr` в рядку `str`, починаючи з позиції `pos`, і повертає позицію, де знаходиться збіг, або `-1` якщо збігів не було знайдено. +Він шукає підрядок `substr` в рядку `str`, починаючи з позиції `pos`, і повертає позицію, де знаходиться збіг, або якщо збігів не було знайдено, то `-1`. Наприклад: @@ -237,7 +237,7 @@ let str = 'Віджет з ідентифікатором'; alert( str.indexOf('ід', 2) ) // 9 ``` -Щоб знайти усі збіги, нам потрібно запустити `indexOf` в циклі. Кожен новий виклик здійснюється з позицією після попереднього збігу: +Щоб знайти усі збіги, нам потрібно запустити `indexOf` в циклі. Кожен новий виклик починається з позиції після попереднього збігу: ```js run let str = 'Хитрий, як лисиця, сильний, як Як'; @@ -356,9 +356,9 @@ alert( "Від*!*жет*/!*".endsWith("жет") ); // true, "Віджет" за ``` `str.substring(start [, end])` -: Повертає частину рядка *між* `start` та `end` (не включаючи `end`).. +: Повертає частину рядка *між* `start` та `end` (не включаючи `end`). - Цей метод майже такий самий що і `slice`, але він дозволяє задати `start` більше ніж `end` (у цьому випадку він просто міняє значення `start` і `end` місцями). + Цей метод майже такий самий як і `slice`, але `.substring` дозволяє задати `start` більше значення, ніж `end` (у такому випадку він просто поміняє значення `start` і `end` місцями). Наприклад: @@ -394,7 +394,7 @@ alert( "Від*!*жет*/!*".endsWith("жет") ); // true, "Віджет" за alert( str.substr(-4, 2) ); // 'gi', починаючи з позиції 4 з кінця отримуєму 2 символа ``` - Цей метод міститься в [Annex B](https://tc39.es/ecma262/#sec-string.prototype.substr) специфікації мови. Це означає, що лише рушії браузерного Javascript мають його підтримувати, і не рекомендується його використовувати. На практиці це підтримується всюди. + Цей метод міститься в [Annex B](https://tc39.es/ecma262/#sec-string.prototype.substr) специфікації мови. Це означає, що його мають підтримувати лише браузерні рушії Javascript, і не рекомендується його використовувати. На практиці це підтримується всюди. Давайте підсумуємо ці методи щоб не заплутатись: @@ -405,7 +405,7 @@ alert( "Від*!*жет*/!*".endsWith("жет") ); // true, "Віджет" за | `substr(start, length)` | `length` символів від `start` | дозволяє відʼємні значення `start` | ```smart header="Який метод вибрати?" -Усі вони можуть виконати задачу. Формально `substr` має незначний недолік: він описаний не в основній специфікації JavaScript, а в Annex B, який охоплює лише функції браузера, які існують переважно з історичних причин. Тому не браузерні середовища, можуть не підтримувати його. Але на практиці це працює всюди. +Усі вони можуть виконати задачу. Формально `substr` має незначний недолік: він описаний не в основній специфікації JavaScript, а в Annex B, яка охоплює лише функції браузера, які існують переважно з історичних причин. Тому не браузерні середовища, можуть не підтримувати його. Але на практиці це працює всюди. З двох інших варіантів `slice` дещо гнучкіший, він допускає від'ємні аргументи та коротший в записі. @@ -424,7 +424,7 @@ alert( "Від*!*жет*/!*".endsWith("жет") ); // true, "Віджет" за alert( 'a' > 'Z' ); // true ``` -2. Літери з діакритичними знаками "не в порядку": +2. Літери з діакритичними знаками "не по порядку": ```js run alert( 'Österreich' > 'Zealand' ); // true @@ -432,7 +432,7 @@ alert( "Від*!*жет*/!*".endsWith("жет") ); // true, "Віджет" за Це може призвести до дивних результатів, якщо ми відсортуємо ці назви країн. Зазвичай люди очікують, що `Zealand` буде після `Österreich`. -Щоб зрозуміти, що відбувається, давайте розглянемо внутрішнє представлення рядків у JavaScript закодованих за допомогою [UTF-16](https://uk.wikipedia.org/wiki/UTF-16). Тобто: кожен символ має відповідний числовий код.. +Щоб розуміти, що відбувається, нам слід бути в курсі, що рядки в JavaScript реалізовані з використанням [UTF-16](https://uk.wikipedia.org/wiki/UTF-16). Тобто, кожен символ має свій відповідний числовий код. Існують спеціальні методи, які дозволяють отримати символ по коду і навпаки. @@ -444,7 +444,7 @@ alert( "Від*!*жет*/!*".endsWith("жет") ); // true, "Віджет" за alert( "z".codePointAt(0) ); // 122 alert( "Z".codePointAt(0) ); // 90 alert( "z".codePointAt(0) ); // 122 - alert( "z".codePointAt(0).toString(16) ); // 7a (if we need a hexadecimal value) + alert( "z".codePointAt(0).toString(16) ); // 7a (якщо нам треба значення в шістнадцятковій системі числення) ``` `String.fromCodePoint(code)` @@ -464,12 +464,12 @@ for (let i = 65; i <= 220; i++) { str += String.fromCodePoint(i); } alert( str ); -// Output: +// alert виведе: // ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„ // ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜ ``` -Бачите? Спочатку вводяться великі символи, потім кілька спеціальних, потім символи нижнього регістру та `Ö` ближче до кінця виводу. +Бачите? Спочатку виводяться великі символи, потім кілька спеціальних, потім символи нижнього регістру та `Ö` ближче до кінця виводу. Тепер стає очевидним, чому `a > Z`. @@ -482,11 +482,11 @@ alert( str ); «Правильний» алгоритм порівняння рядків є складнішим, ніж може здатися, тому що для різних мов – різні алфавіти. -Отже, браузеру потрібно знати, яку мову використовувати для порівняння. +Отже, браузеру потрібно знати алфавіт якої мови використовувати для порівняння. На щастя, усі сучасні браузери підтримують стандарт інтернаціоналізації [ECMA-402](https://www.ecma-international.org/publications-and-standards/standards/ecma-402/). -Він забезпечує спеціальний метод для порівняння рядків різними мовами, дотримуючись їхніх правил. +Він забезпечує спеціальний метод для порівняння рядків з різних мов, дотримуючись їхніх правил. Виклик [str.localeCompare(str2)](mdn:js/String/localeCompare) повертає ціле число, яке вказує, чи є `str` меншим, рівним чи більшим за `str2` відповідно до правил мови: @@ -500,7 +500,7 @@ alert( str ); alert( 'Österreich'.localeCompare('Zealand') ); // -1 ``` -Цей метод насправді має два додаткові аргументи, зазначені в [документації](mdn:js/String/localeCompare), що дозволяє йому вказати мову (типово взяту з середовища, порядок букв залежить від мови) і встановити додаткові правила, як-от чутливість до регістру або чи слід розглядати різницю між `"a"` та `"á"`. +Цей метод насправді має два додаткові аргументи, зазначені в [документації](mdn:js/String/localeCompare), що дозволяє явно вказати йому мову (яку він за замовчуванням визначає опираючись на середовище. І від чого залежить порядок букв), і встановити додаткові правила, як-от чутливість до регістру або чи слід розглядати різницю між `"a"` та `"á"`. ## Підсумки @@ -510,7 +510,7 @@ alert( 'Österreich'.localeCompare('Zealand') ); // -1 - Щоб отримати підрядок, використовуйте: `slice` або `substring`. - Щоб перевести рядок у нижній/верхній регістри, використовуйте: `toLowerCase/toUpperCase`. - Щоб знайти підрядок, використовуйте: `indexOf`, або `includes/startsWith/endsWith` для простих перевірок. -- Щоб порівняти рядки з урахуванням правил мови, використовуйте: `localeCompare`, інакше вони порівнюються за кодами символів. +- Щоб порівняти рядки з урахуванням правил мови, використовуйте `localeCompare`, інакше рядки порівнюються за кодами символів. Є кілька інших корисних методів у рядках: