Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix string (01-05-03) #704

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions 1-js/05-data-types/03-string/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ alert(str1 == str2); // true

Усі спеціальні символи починаються зі зворотного слеша `\`. Його також називають "символом екранування".

Оскільки це так особливо, якщо нам потрібно показати зворотний слеш `\` у рядку, нам потрібно подвоїти його:
Оскільки він не зовсім звичайний, то якщо нам потрібно показати зворотний слеш `\` у рядку, нам потрібно подвоїти його:

```js run
alert( `Зворотний слеш: \\` ); // Зворотний слеш: \
Expand All @@ -101,9 +101,9 @@ alert( `Зворотний слеш: \\` ); // Зворотний слеш: \
alert( 'Ім*!*\'*/!*я моє — Морж!' ); // *!*Ім'я*/!* моє — Морж!
```

Як бачите, ми повинні "екранувати" лапку зворотним слешем `\'`, оскільки інакше це означало б кінець рядка.
Як бачите, ми повинні "екранувати" лапку зворотним слешем `\'`, оскільки інакше ця лапка означала б кінець рядка.

Звісно, потрібно "екранувати" лише такі лапки, якими обрамлений рядок. Як елегантніше рішення, ми могли б замість цього скористатися подвійними або зворотними лапками:
Звісно ж, потрібно "екранувати" лише такі лапки, якими обрамлений рядок. Або ще елегантнішим рішенням було б якби ми замість цього скористалися подвійними або зворотними лапками:

```js run
alert( `Ім'я моє — Морж!` ); // Ім'я моє — Морж!
Expand Down Expand Up @@ -214,7 +214,7 @@ alert( 'Interface'[0].toLowerCase() ); // 'і'

Перший метод -- [str.indexOf(substr, pos)](mdn:js/String/indexOf).

Він шукає підрядок `substr` в рядку `str`, починаючи з позиції `pos`, і повертає позицію, де знаходиться збіг, або `-1` якщо збігів не було знайдено.
Він шукає підрядок `substr` в рядку `str`, починаючи з позиції `pos`, і повертає позицію, де знаходиться збіг, або якщо збігів не було знайдено, то `-1`.

Наприклад:

Expand All @@ -237,7 +237,7 @@ let str = 'Віджет з ідентифікатором';
alert( str.indexOf('ід', 2) ) // 9
```

Щоб знайти усі збіги, нам потрібно запустити `indexOf` в циклі. Кожен новий виклик здійснюється з позицією після попереднього збігу:
Щоб знайти усі збіги, нам потрібно запустити `indexOf` в циклі. Кожен новий виклик починається з позиції після попереднього збігу:

```js run
let str = 'Хитрий, як лисиця, сильний, як Як';
Expand Down Expand Up @@ -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` місцями).

Наприклад:

Expand Down Expand Up @@ -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, і не рекомендується його використовувати. На практиці це підтримується всюди.

Давайте підсумуємо ці методи щоб не заплутатись:

Expand All @@ -405,7 +405,7 @@ alert( "Від*!*жет*/!*".endsWith("жет") ); // true, "Віджет" за
| `substr(start, length)` | `length` символів від `start` | дозволяє відʼємні значення `start` |

```smart header="Який метод вибрати?"
Усі вони можуть виконати задачу. Формально `substr` має незначний недолік: він описаний не в основній специфікації JavaScript, а в Annex B, який охоплює лише функції браузера, які існують переважно з історичних причин. Тому не браузерні середовища, можуть не підтримувати його. Але на практиці це працює всюди.
Усі вони можуть виконати задачу. Формально `substr` має незначний недолік: він описаний не в основній специфікації JavaScript, а в Annex B, яка охоплює лише функції браузера, які існують переважно з історичних причин. Тому не браузерні середовища, можуть не підтримувати його. Але на практиці це працює всюди.

З двох інших варіантів `slice` дещо гнучкіший, він допускає від'ємні аргументи та коротший в записі.

Expand All @@ -424,15 +424,15 @@ alert( "Від*!*жет*/!*".endsWith("жет") ); // true, "Віджет" за
alert( 'a' > 'Z' ); // true
```

2. Літери з діакритичними знаками "не в порядку":
2. Літери з діакритичними знаками "не по порядку":

```js run
alert( 'Österreich' > 'Zealand' ); // true
```

Це може призвести до дивних результатів, якщо ми відсортуємо ці назви країн. Зазвичай люди очікують, що `Zealand` буде після `Österreich`.

Щоб зрозуміти, що відбувається, давайте розглянемо внутрішнє представлення рядків у JavaScript закодованих за допомогою [UTF-16](https://uk.wikipedia.org/wiki/UTF-16). Тобто: кожен символ має відповідний числовий код..
Щоб розуміти, що відбувається, нам слід бути в курсі, що рядки в JavaScript реалізовані з використанням [UTF-16](https://uk.wikipedia.org/wiki/UTF-16). Тобто, кожен символ має свій відповідний числовий код.

Існують спеціальні методи, які дозволяють отримати символ по коду і навпаки.

Expand All @@ -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)`
Expand All @@ -464,12 +464,12 @@ for (let i = 65; i <= 220; i++) {
str += String.fromCodePoint(i);
}
alert( str );
// Output:
// alert виведе:
// ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„
// ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜ
```

Бачите? Спочатку вводяться великі символи, потім кілька спеціальних, потім символи нижнього регістру та `Ö` ближче до кінця виводу.
Бачите? Спочатку виводяться великі символи, потім кілька спеціальних, потім символи нижнього регістру та `Ö` ближче до кінця виводу.

Тепер стає очевидним, чому `a > Z`.

Expand All @@ -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` відповідно до правил мови:

Expand All @@ -500,7 +500,7 @@ alert( str );
alert( 'Österreich'.localeCompare('Zealand') ); // -1
```

Цей метод насправді має два додаткові аргументи, зазначені в [документації](mdn:js/String/localeCompare), що дозволяє йому вказати мову (типово взяту з середовища, порядок букв залежить від мови) і встановити додаткові правила, як-от чутливість до регістру або чи слід розглядати різницю між `"a"` та `"á"`.
Цей метод насправді має два додаткові аргументи, зазначені в [документації](mdn:js/String/localeCompare), що дозволяє явно вказати йому мову (яку він за замовчуванням визначає опираючись на середовище. І від чого залежить порядок букв), і встановити додаткові правила, як-от чутливість до регістру або чи слід розглядати різницю між `"a"` та `"á"`.

## Підсумки

Expand All @@ -510,7 +510,7 @@ alert( 'Österreich'.localeCompare('Zealand') ); // -1
- Щоб отримати підрядок, використовуйте: `slice` або `substring`.
- Щоб перевести рядок у нижній/верхній регістри, використовуйте: `toLowerCase/toUpperCase`.
- Щоб знайти підрядок, використовуйте: `indexOf`, або `includes/startsWith/endsWith` для простих перевірок.
- Щоб порівняти рядки з урахуванням правил мови, використовуйте: `localeCompare`, інакше вони порівнюються за кодами символів.
- Щоб порівняти рядки з урахуванням правил мови, використовуйте `localeCompare`, інакше рядки порівнюються за кодами символів.

Є кілька інших корисних методів у рядках:

Expand Down