You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Об'єкти дозволяють зберігати набори значень з ключами. Це чудово.
Але досить часто ми розуміємо, що нам необхідна впорядкована колекція даних, яка складається з 1-го, 2-го, 3-го тощо елементів. Наприклад, така колекція може знадобитись для зберігання списку користувачів, товарів, HTML елементів та ін.
Але досить часто ми розуміємо, що нам необхідна впорядкована колекція даних, яка складається з 1-го, 2-го, 3-го і так далі елементів. Наприклад, така колекція може знадобитись для зберігання списку користувачів, товарів, HTML елементів та ін.
Використовувати об'єкти в такому випадку не зручно, тому що вони не надають методів управління порядком елементів. Ми не можемо вставити нову властивість "між" тих, що вже існують. Об'єкти просто не призначені для цього.
Що `fruits.pop()`, що `fruits.at(-1)` -- обидва повертають останній елемент масиву, але `fruits.pop()` також змінює масив, видаляючи його.
Що `fruits.pop()`, що `fruits.at(-1)` -- обидва повертають останній елемент масиву, але `fruits.pop()` також змінює масив, видаляючи цей елемент.
`push`
: Додає елемент в кінець масиву:
Expand DownExpand Up
@@ -248,7 +248,7 @@ arr.push("Груша"); // зміна масиву за посиланням
alert( fruits ); // "Банан", "Груша" -- наразі два елементи
```
...Але те, що робить масиви дійсно особливими –- це їх внутрішнє представлення. Рушій JavaScript намагається зберігати елементи масиву у неперервній області пам'яті, один за одним, як це представлено на ілюстраціях в цьому розділі, а також застосовує інші способи оптимізації, що дозволяють масивам працювати дуже швидко.
...Але те, що робить масиви дійсно особливими – це їхнє внутрішнє представлення. Рушій JavaScript намагається зберігати елементи масиву у неперервній області пам'яті, один за одним, як це представлено на ілюстраціях в цьому розділі, а також застосовує інші способи оптимізації, що дозволяють масивам працювати дуже швидко.
Проте масиви втратять всю свою ефективність, якщо ми перестанемо працювати з ними як з "упорядкованою колекцією даних" і почнемо використовувати як звичайний об'єкт.
Це можливо тому, що в основі масивів -- об'єкти. Ми можемо додати будь-які властивості до них.
Але рушій зрозуміє, що ми використовуємо масиви, як звичайні об'єкти. Методи оптимізації, які використовуються для масивів в цьому випадку не підходять, тому вони будуть відключені та не принесуть ніякої користі.
Але рушій зрозуміє, що ми використовуємо масиви як звичайні об'єкти. Методи оптимізації, які використовуються для масивів, в цьому випадку не підходять, тому вони будуть відключені та не принесуть ніякої користі.
fruits.shift(); // видалити один елемент з початку
```
Але недостатньо просто взяти та видалити елемент з номером `0`. Всі інші елементи також необхідно пронумерувати ще раз.
Цедостатньо просто взяти та видалити елемент з номером `0`. Всі інші елементи також необхідно пронумерувати ще раз.
Операція `shift` має виконати 3 дії:
Expand DownExpand 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` для масивів.
Він використовується рідше, адже використання квадратних дужок `[]` більш зручний спосіб. Крім того, `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 DownExpand 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 DownExpand 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>.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.