diff --git a/1-js/05-data-types/04-array/1-item-value/solution.md b/1-js/05-data-types/04-array/1-item-value/solution.md
index f70732314..64cd69f83 100644
--- a/1-js/05-data-types/04-array/1-item-value/solution.md
+++ b/1-js/05-data-types/04-array/1-item-value/solution.md
@@ -13,4 +13,4 @@ alert( fruits.length ); // 4
 */!*
 ```
 
-Це відбувається тому, що масиви — це об’єкти. Отже, `shoppingCart` та `fruits` посилаються на один і той самий об’єкт.
+Це відбувається тому, що масиви — це об’єкти. Отже, `shoppingCart` та `fruits` посилаються на один і той самий масив.
diff --git a/1-js/05-data-types/04-array/3-call-array-this/solution.md b/1-js/05-data-types/04-array/3-call-array-this/solution.md
index 17b7c0c02..7e606198d 100644
--- a/1-js/05-data-types/04-array/3-call-array-this/solution.md
+++ b/1-js/05-data-types/04-array/3-call-array-this/solution.md
@@ -12,4 +12,4 @@ arr.push(function() {
 arr[2](); // a,b,function(){...}
 ```
 
-Масив має 3 елемента, спочатку їх було 2, плюс функція. 
+Масив має 3 елемента: початкових 2, плюс функція. 
diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md
index 0713db8b7..a2fde741b 100644
--- a/1-js/05-data-types/04-array/article.md
+++ b/1-js/05-data-types/04-array/article.md
@@ -2,7 +2,7 @@
 
 Об'єкти дозволяють зберігати набори значень з ключами. Це чудово.
 
-Але досить часто ми розуміємо, що нам необхідна впорядкована колекція даних, яка складається з 1-го, 2-го, 3-го тощо елементів. Наприклад, така колекція може знадобитись для зберігання списку користувачів, товарів, HTML елементів та ін.
+Але досить часто ми розуміємо, що нам необхідна впорядкована колекція даних, яка складається з 1-го, 2-го, 3-го і так далі елементів. Наприклад, така колекція може знадобитись для зберігання списку користувачів, товарів, HTML елементів та ін.
 
 Використовувати об'єкти в такому випадку не зручно, тому що вони не надають методів управління порядком елементів. Ми не можемо вставити нову властивість "між" тих, що вже існують. Об'єкти просто не призначені для цього.
 
@@ -128,7 +128,7 @@ alert( fruits.at(-1) ); // Слива
 
 Інакше кажучи, `arr.at(i)`:
 - те саме, що й `arr[i]`, якщо `i >= 0`.
-- для від'ємних значень `i` він шукає елемент відступаючи від кінця масиву.
+- для від'ємних значень `i` цей метод шукає елемент починаючи з кінця масиву.
 
 ## Методи pop/push, shift/unshift
 
@@ -141,9 +141,9 @@ alert( fruits.at(-1) ); // Слива
 
 Масиви підтримують обидві операції.
 
-На практиці це дуже часто стає у пригоді. Наприклад, черга з повідомлень, які необхідно показувати на екрані.
+Це дуже часто стає у пригоді на практиці. Наприклад, черга з повідомлень, які необхідно показувати на екрані.
 
-Існує також інший варіант використання масивів -- структура даних, яка називається [стек](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)).
+Існує також інший варіант використання масивів -- структура даних, яка називається [стек](https://uk.wikipedia.org/wiki/Стек).
 
 Вона підтримує два типи операцій:
 
@@ -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`
 : Додає елемент в кінець масиву:
@@ -248,7 +248,7 @@ arr.push("Груша"); // зміна масиву за посиланням
 alert( fruits ); // "Банан", "Груша" -- наразі два елементи
 ```
 
-...Але те, що робить масиви дійсно особливими –- це їх внутрішнє представлення. Рушій JavaScript намагається зберігати елементи масиву у неперервній області пам'яті, один за одним, як це представлено на ілюстраціях в цьому розділі, а також застосовує інші способи оптимізації, що дозволяють масивам працювати дуже швидко.
+...Але те, що робить масиви дійсно особливими – це їхнє внутрішнє представлення. Рушій JavaScript намагається зберігати елементи масиву у неперервній області пам'яті, один за одним, як це представлено на ілюстраціях в цьому розділі, а також застосовує інші способи оптимізації, що дозволяють масивам працювати дуже швидко.
 
 Проте масиви втратять всю свою ефективність, якщо ми перестанемо працювати з ними як з "упорядкованою колекцією даних" і почнемо використовувати як звичайний об'єкт.
 
@@ -264,7 +264,7 @@ fruits.age = 25; // створюємо властивість з довільн
 
 Це можливо тому, що в основі масивів -- об'єкти. Ми можемо додати будь-які властивості до них.
 
-Але рушій зрозуміє, що ми використовуємо масиви, як звичайні об'єкти. Методи оптимізації, які використовуються для масивів в цьому випадку не підходять, тому вони будуть відключені та не принесуть ніякої користі.
+Але рушій зрозуміє, що ми використовуємо масиви як звичайні об'єкти. Методи оптимізації, які використовуються для масивів, в цьому випадку не підходять, тому вони будуть відключені та не принесуть ніякої користі.
 
 Варіанти неправильного використання масивів:
 
@@ -286,7 +286,7 @@ fruits.age = 25; // створюємо властивість з довільн
 fruits.shift(); // видалити один елемент з початку
 ```
 
-Але недостатньо просто взяти та видалити елемент з номером `0`. Всі інші елементи також необхідно пронумерувати ще раз.
+Цедостатньо просто взяти та видалити елемент з номером `0`. Всі інші елементи також необхідно пронумерувати ще раз.
 
 Операція `shift` має виконати 3 дії:
 
@@ -359,7 +359,7 @@ for (let key in arr) {
 
     У браузерах та різних програмних середовищах існують масивоподібні об'єкти, *які виглядають як масив*. Тобто вони мають властивість `length` та індекси, проте вони також містять інші нечислові властивості та методи, які нам часто не потрібні. Цикл `for..in` відобразить і їх. Тому, коли нам необхідно працювати з масивами, ці "екстра" властивості можуть стати проблемою.
 
-2. Цикл `for..in` оптимізований для довільних об'єктів, не для масивів, і тому працює в 10-100 разів повільніше. Звісно, це все одно дуже швидко. Збільшення швидкості виконання має значення лише у *вузьких місцях*. Але ми все одно повинні бути обережні з відмінностями.
+2. Цикл `for..in` оптимізований для довільних об'єктів, не для масивів, і тому працює в 10-100 разів повільніше. Звісно, це все одно дуже швидко. Збільшення швидкості виконання має значення лише у *вузьких місцях*. Але ми все одно маємо розуміти цю відмінність.
 
 Словом, не варто використовувати цикл `for..in` для масивів.
 
@@ -406,9 +406,9 @@ let arr = *!*new Array*/!*("Яблуко", "Груша", "etc");
 
 Він використовується рідше, адже використання квадратних дужок `[]` більш зручний спосіб. Крім того, `new Array` має певну особливість.
 
-Якщо `new Array` викликається з одним аргументом, а саме числом, він створить порожній масив з довжиною, яка дорівнює *цьому числу*.
+Якщо `new Array` викликається з одним аргументом і цей аргумент число - він створить порожній масив з довжиною, яка дорівнює *цьому числу*.
 
-Подивімось, як можна завдати собі ведмежої послуги:
+Подивімось, як можна вистрілити собі в ногу:
 
 ```js run
 let arr = new Array(2); // чи створиться масив [2] ?
@@ -420,7 +420,7 @@ alert( arr.length ); // довжина 2
 
 Для того, щоб позбутись таких сюрпризів, ми використовуємо квадратні дужки `[]`, якщо тільки ми дійсно не маємо причини для використання методу `new Array`.
 
-## Багатовимірні масиви 
+## Багатовимірні масиви
 
 Масиви можуть містити елементи, які своєю чергою теж є масивами. Ми можемо використовувати це для створення багатовимірних масивів, наприклад, для зберігання матриць:
 
@@ -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"`.
 
 Коли бінарний оператор `"+"` додає щось до рядка, це конвертується в рядок та виглядає наступним чином:
 
@@ -478,7 +478,7 @@ alert( "1,2" + 1 ); // "1,21"
 - Якщо один з аргументів оператора `==` об'єкт, а інший -- примітив, тоді об'єкт конвертується в примітив. Це пояснюється в розділі <info:object-toprimitive>.
 - ...Лише два виключення -- це `null` та `undefined`, які рівні `==` один одному та нічому більше.
 
-Строге порівняння `===` ще простіше, тому що не конвертує типи. 
+З строгим порівнянням `===` навіть простіше, бо воно не конвертує типи.
 
 Тому, якщо ми порівнюємо масиви оператором `==`, то вони ніколи не будуть однаковими, за виключенням, коли ми порівнюємо дві змінні, які посилаються на один масив.
 
@@ -490,7 +490,7 @@ alert( [0] == [0] ); // false
 
 Технічно ці масиви є різними об'єктами. Тому вони не рівні. Оператор `==` не порівнює елемент за елементом.
 
-Порівняння масиву з примітивами теж може дати досить цікаві результати:
+Порівняння масиву з примітивами може дати небажані результати:
 
 ```js run
 alert( 0 == [] ); // true
@@ -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]`.
 
 Ми можемо використовувати масив як двосторонню чергу за допомогою наступних операцій:
 
@@ -553,4 +553,4 @@ let arr = new Array(item1, item2...);
 
 Натомість для порівняння масивів використовуйте цикл `for..of`, щоб порівнювати елемент за елементом.
 
-Ми повернемось до масивів та вивчимо методи додавання, видалення, відокремлення елементів та сортування масивів в розділі <info:array-methods>.
+Ми повернемось до масивів та вивчимо методи додавання, видалення, відокремлення елементів та сортування масивів в наступному розділі <info:array-methods>.