Метод push()
push() додає один або кілька елементів у кінець масиву і повертає нову довжину цього масиву. Це один з найчастіше використовуваних методів у JavaScript, і головне, що про нього треба пам'ятати: він змінює вихідний масив, а повертає число.
Теорія
TL;DR
- Додає елементи в кінець масиву.
- Мутує вихідний масив, нового масиву не створює.
- Повертає нову довжину масиву, тобто число, а не сам масив.
- Приймає скільки завгодно аргументів:
arr.push(3, 4, 5). - Немутуюча альтернатива, це spread:
const newArr = [...arr, 3].
Швидкий приклад
const fruits = ["apple", "banana"];
const newLength = fruits.push("cherry");
console.log(fruits); // ["apple", "banana", "cherry"]
console.log(newLength); // 3Зверніть увагу:
- Метод змінює вихідний масив, мутує його.
- Повертає не сам масив, а кількість елементів після додавання.
Кілька елементів за один виклик
push() приймає будь-яку кількість аргументів і додає їх по черзі.
const arr = [1, 2];
arr.push(3, 4, 5);
console.log(arr); // [1, 2, 3, 4, 5]Як саме працює метод
- Елементи додаються в кінець масиву.
- Індекси нових елементів починаються з поточного значення
length. - Значення, яке повертається, це нове значення
arr.length.
Тобто для масиву з двох елементів перший доданий елемент отримає індекс 2, наступний 3 і так далі.
Важливі нюанси
-
push()працює тільки з масивами або з масивоподібними об'єктами, наприклад черезArray.prototype.push.call(arrayLike, value). -
Якщо написати
arr = arr.push(...), ви втратите сам масив, бо у змінну потрапить число:javascriptlet arr = [1, 2]; arr = arr.push(3); // arr now holds the number 3, the array is lost console.log(arr); // 3Якщо масив оголошено через
const, такий рядок взагалі впаде зTypeError: Assignment to constant variable. І це добре, бо помилку видно одразу.
Коротка таблиця
| Питання | Відповідь |
|---|---|
| Що робить | Додає елементи в кінець масиву |
| Чи змінює вихідний масив | Так, мутує його |
| Що повертає | Нову довжину масиву |
| Чи можна додати кілька елементів | Так |
| Приклад | arr.push(1, 2, 3) |
Альтернатива без мутації
Якщо потрібно додати елемент без зміни оригіналу, наприклад у React state або в Redux reducer, використовуйте spread:
const arr = [1, 2];
const newArr = [...arr, 3];
console.log(newArr); // [1, 2, 3]
console.log(arr); // [1, 2] (unchanged)Такий підхід створює новий масив, тому порівняння за посиланням спрацює і компонент перерендериться.
Типові помилки
- Присвоювати результат назад:
arr = arr.push(x)перетворює змінну на число і знищує посилання на масив. - Очікувати новий масив.
push()не повертає масив, тому ланцюжокarr.push(1).push(2)впаде з помилкою: у числа немає методуpush. - Мутувати state напряму. У React
state.push(item)не спричинить перерендер, бо посилання на масив не змінилося. Потрібен[...state, item]. - Плутати
push()іconcat().concat()не мутує і повертає новий масив,push()мутує і повертає довжину. - Розгортати масив у масив.
arr.push([1, 2])додасть один елемент, вкладений масив. Щоб додати елементи по одному, потрібенarr.push(...[1, 2]). - Викликати
push()на рядку. Рядки незмінні, методуpushу них немає.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.