Skip to content

Fix array (01-05-04) #705

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

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion 1-js/05-data-types/04-array/1-item-value/solution.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ alert( fruits.length ); // 4
*/!*
```

Це відбувається тому, що масиви — це об’єкти. Отже, `shoppingCart` та `fruits` посилаються на один і той самий об’єкт.
Це відбувається тому, що масиви — це об’єкти. Отже, `shoppingCart` та `fruits` посилаються на один і той самий масив.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

І суто логічно було б вжити слово масив, і навіть в англ. версії там теж вживається слово масив.

2 changes: 1 addition & 1 deletion 1-js/05-data-types/04-array/3-call-array-this/solution.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ arr.push(function() {
arr[2](); // a,b,function(){...}
```

Масив має 3 елемента, спочатку їх було 2, плюс функція.
Масив має 3 елемента: початкових 2, плюс функція.
34 changes: 17 additions & 17 deletions 1-js/05-data-types/04-array/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Об'єкти дозволяють зберігати набори значень з ключами. Це чудово.

Але досить часто ми розуміємо, що нам необхідна впорядкована колекція даних, яка складається з 1-го, 2-го, 3-го тощо елементів. Наприклад, така колекція може знадобитись для зберігання списку користувачів, товарів, HTML елементів та ін.
Але досить часто ми розуміємо, що нам необхідна впорядкована колекція даних, яка складається з 1-го, 2-го, 3-го і так далі елементів. Наприклад, така колекція може знадобитись для зберігання списку користувачів, товарів, HTML елементів та ін.

Використовувати об'єкти в такому випадку не зручно, тому що вони не надають методів управління порядком елементів. Ми не можемо вставити нову властивість "між" тих, що вже існують. Об'єкти просто не призначені для цього.

Expand Down Expand Up @@ -128,7 +128,7 @@ alert( fruits.at(-1) ); // Слива

Інакше кажучи, `arr.at(i)`:
- те саме, що й `arr[i]`, якщо `i >= 0`.
- для від'ємних значень `i` він шукає елемент відступаючи від кінця масиву.
- для від'ємних значень `i` цей метод шукає елемент починаючи з кінця масиву.

## Методи pop/push, shift/unshift

Expand All @@ -141,9 +141,9 @@ alert( fruits.at(-1) ); // Слива

Масиви підтримують обидві операції.

На практиці це дуже часто стає у пригоді. Наприклад, черга з повідомлень, які необхідно показувати на екрані.
Це дуже часто стає у пригоді на практиці. Наприклад, черга з повідомлень, які необхідно показувати на екрані.

Існує також інший варіант використання масивів -- структура даних, яка називається [стек](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)).
Існує також інший варіант використання масивів -- структура даних, яка називається [стек](https://uk.wikipedia.org/wiki/Стек).

Вона підтримує два типи операцій:

Expand Down Expand Up @@ -175,7 +175,7 @@ alert( fruits.at(-1) ); // Слива
alert( fruits ); // Яблуко,Апельсин
```

Що `fruits.pop()`, що `fruits.at(-1)` -- обидва повертають останній елемент масиву, але `fruits.pop()` також змінює масив, видаляючи його.
Що `fruits.pop()`, що `fruits.at(-1)` -- обидва повертають останній елемент масиву, але `fruits.pop()` також змінює масив, видаляючи цей елемент.

`push`
: Додає елемент в кінець масиву:
Expand Down Expand Up @@ -248,7 +248,7 @@ arr.push("Груша"); // зміна масиву за посиланням
alert( fruits ); // "Банан", "Груша" -- наразі два елементи
```

...Але те, що робить масиви дійсно особливими –- це їх внутрішнє представлення. Рушій JavaScript намагається зберігати елементи масиву у неперервній області пам'яті, один за одним, як це представлено на ілюстраціях в цьому розділі, а також застосовує інші способи оптимізації, що дозволяють масивам працювати дуже швидко.
...Але те, що робить масиви дійсно особливими – це їхнє внутрішнє представлення. Рушій JavaScript намагається зберігати елементи масиву у неперервній області пам'яті, один за одним, як це представлено на ілюстраціях в цьому розділі, а також застосовує інші способи оптимізації, що дозволяють масивам працювати дуже швидко.

Проте масиви втратять всю свою ефективність, якщо ми перестанемо працювати з ними як з "упорядкованою колекцією даних" і почнемо використовувати як звичайний об'єкт.

Expand All @@ -264,7 +264,7 @@ fruits.age = 25; // створюємо властивість з довільн

Це можливо тому, що в основі масивів -- об'єкти. Ми можемо додати будь-які властивості до них.

Але рушій зрозуміє, що ми використовуємо масиви, як звичайні об'єкти. Методи оптимізації, які використовуються для масивів в цьому випадку не підходять, тому вони будуть відключені та не принесуть ніякої користі.
Але рушій зрозуміє, що ми використовуємо масиви як звичайні об'єкти. Методи оптимізації, які використовуються для масивів, в цьому випадку не підходять, тому вони будуть відключені та не принесуть ніякої користі.

Варіанти неправильного використання масивів:

Expand All @@ -286,7 +286,7 @@ fruits.age = 25; // створюємо властивість з довільн
fruits.shift(); // видалити один елемент з початку
```

Але недостатньо просто взяти та видалити елемент з номером `0`. Всі інші елементи також необхідно пронумерувати ще раз.
Цедостатньо просто взяти та видалити елемент з номером `0`. Всі інші елементи також необхідно пронумерувати ще раз.

Операція `shift` має виконати 3 дії:

Expand Down Expand Up @@ -359,7 +359,7 @@ for (let key in arr) {

У браузерах та різних програмних середовищах існують масивоподібні об'єкти, *які виглядають як масив*. Тобто вони мають властивість `length` та індекси, проте вони також містять інші нечислові властивості та методи, які нам часто не потрібні. Цикл `for..in` відобразить і їх. Тому, коли нам необхідно працювати з масивами, ці "екстра" властивості можуть стати проблемою.

2. Цикл `for..in` оптимізований для довільних об'єктів, не для масивів, і тому працює в 10-100 разів повільніше. Звісно, це все одно дуже швидко. Збільшення швидкості виконання має значення лише у *вузьких місцях*. Але ми все одно повинні бути обережні з відмінностями.
2. Цикл `for..in` оптимізований для довільних об'єктів, не для масивів, і тому працює в 10-100 разів повільніше. Звісно, це все одно дуже швидко. Збільшення швидкості виконання має значення лише у *вузьких місцях*. Але ми все одно маємо розуміти цю відмінність.

Словом, не варто використовувати цикл `for..in` для масивів.

Expand Down Expand Up @@ -406,9 +406,9 @@ let arr = *!*new Array*/!*("Яблуко", "Груша", "etc");

Він використовується рідше, адже використання квадратних дужок `[]` більш зручний спосіб. Крім того, `new Array` має певну особливість.

Якщо `new Array` викликається з одним аргументом, а саме числом, він створить порожній масив з довжиною, яка дорівнює *цьому числу*.
Якщо `new Array` викликається з одним аргументом і цей аргумент число - він створить порожній масив з довжиною, яка дорівнює *цьому числу*.

Подивімось, як можна завдати собі ведмежої послуги:
Подивімось, як можна вистрілити собі в ногу:

```js run
let arr = new Array(2); // чи створиться масив [2] ?
Expand All @@ -420,7 +420,7 @@ alert( arr.length ); // довжина 2

Для того, щоб позбутись таких сюрпризів, ми використовуємо квадратні дужки `[]`, якщо тільки ми дійсно не маємо причини для використання методу `new Array`.

## Багатовимірні масиви
## Багатовимірні масиви

Масиви можуть містити елементи, які своєю чергою теж є масивами. Ми можемо використовувати це для створення багатовимірних масивів, наприклад, для зберігання матриць:

Expand Down Expand Up @@ -456,7 +456,7 @@ alert( [1] + 1 ); // "11"
alert( [1,2] + 1 ); // "1,21"
```

Масиви не мають `Symbol.toPrimitive`, або робочого `valueOf`, вони реалізують лише метод `toString` таким чином, що `[]` стає порожнім рядком, `[1]` стає `"1"` або `[1,2]` стає `"1,2"`.
Масиви не мають `Symbol.toPrimitive`, або робочого `valueOf`. Вони реалізують лише метод `toString`, який робить `[]` порожнім рядком, `[1]` робить `"1"`, а `[1,2]` робить `"1,2"`.

Коли бінарний оператор `"+"` додає щось до рядка, це конвертується в рядок та виглядає наступним чином:

Expand All @@ -478,7 +478,7 @@ alert( "1,2" + 1 ); // "1,21"
- Якщо один з аргументів оператора `==` об'єкт, а інший -- примітив, тоді об'єкт конвертується в примітив. Це пояснюється в розділі <info:object-toprimitive>.
- ...Лише два виключення -- це `null` та `undefined`, які рівні `==` один одному та нічому більше.

Строге порівняння `===` ще простіше, тому що не конвертує типи.
З строгим порівнянням `===` навіть простіше, бо воно не конвертує типи.

Тому, якщо ми порівнюємо масиви оператором `==`, то вони ніколи не будуть однаковими, за виключенням, коли ми порівнюємо дві змінні, які посилаються на один масив.

Expand All @@ -490,7 +490,7 @@ alert( [0] == [0] ); // false

Технічно ці масиви є різними об'єктами. Тому вони не рівні. Оператор `==` не порівнює елемент за елементом.

Порівняння масиву з примітивами теж може дати досить цікаві результати:
Порівняння масиву з примітивами може дати небажані результати:

```js run
alert( 0 == [] ); // true
Expand Down Expand Up @@ -535,7 +535,7 @@ let arr = new Array(item1, item2...);
Отримання елементів:

- ми можемо отримати елемент за його індексом, ось так `arr[0]`
- також ми можемо використати метод `at(i)`, який допускає від'ємні індекси. Для від'ємних значень `i` він відступає від кінця масиву. Якщо `i >= 0`, він працює так само як `arr[i]`.
- також ми можемо використати метод `at(i)`, який допускає від'ємні індекси. При від'ємних значеннях `i` він шукатиме від кінця масиву. Якщо `i >= 0`, він працює так само як `arr[i]`.

Ми можемо використовувати масив як двосторонню чергу за допомогою наступних операцій:

Expand All @@ -553,4 +553,4 @@ let arr = new Array(item1, item2...);

Натомість для порівняння масивів використовуйте цикл `for..of`, щоб порівнювати елемент за елементом.

Ми повернемось до масивів та вивчимо методи додавання, видалення, відокремлення елементів та сортування масивів в розділі <info:array-methods>.
Ми повернемось до масивів та вивчимо методи додавання, видалення, відокремлення елементів та сортування масивів в наступному розділі <info:array-methods>.