Ответ
Методы массивов в JavaScript используются для их модификации, обхода и преобразования. Их можно разделить на несколько категорий:
Методы, изменяющие исходный массив (мутирующие):
push(...items)/pop()– добавляет элементы в конец / удаляет последний элемент.unshift(...items)/shift()– добавляет элементы в начало / удаляет первый элемент.splice(start, deleteCount, ...items)– универсальный метод для удаления, замены или вставки элементов.sort(compareFn)/reverse()– сортирует и переворачивает массив.
Методы, возвращающие новый массив (не мутирующие):
slice(start, end)– возвращает новый массив — копию части исходного.concat(...items)– возвращает новый массив, объединяя исходный с другими массивами или значениями.map(callbackFn)– создаёт новый массив, применяя функцию к каждому элементу.filter(callbackFn)– создаёт новый массив из элементов, прошедших проверку.
Методы для поиска и обхода:
find(callbackFn)/findIndex(callbackFn)– возвращает первый удовлетворяющий условию элемент / его индекс.forEach(callbackFn)– выполняет функцию для каждого элемента (аналог циклаfor).some(callbackFn)/every(callbackFn)– проверяет, удовлетворяет ли условию хотя бы один / все элементы.
Пример использования:
const numbers = [1, 2, 3];
// Мутирующий метод
numbers.push(4); // numbers теперь [1, 2, 3, 4]
// Не мутирующие методы
const doubled = numbers.map(x => x * 2); // [2, 4, 6, 8]
const even = numbers.filter(x => x % 2 === 0); // [2, 4]
const found = numbers.find(x => x > 2); // 3
// Исходный массив не изменился не мутирующими методами
console.log(numbers); // [1, 2, 3, 4] Ответ 18+ 🔞
О, так, смотри, сейчас я тебе про массивы в JavaScript расскажу так, что ты, блядь, не только поймёшь, но и запомнишь на всю оставшуюся жизнь, как отче наш. Это ж не просто какая-то хуйня, это основа основ, инструменты, без которых ты — как Герасим без Муму, нихуя не скажешь.
Вот смотри, все эти методы можно, грубо говоря, поделить на две банды.
Первая банда — отморозки, которые всё ломают. Они приходят в твой массив и начинают его пилить, резать, переставлять. Исходник после них — пиздец, помойка. Это мутирующие методы, ёпта.
push(...items)/pop()— один суёт новые элементы в конец массива, как последнюю водку в холодильник, а второй этот последний элемент и вытаскивает, как пробку.pop()— это как «ой, всё».unshift(...items)/shift()— те же яйца, только с другого конца.unshiftзасовывает в начало,shiftвыдёргивает первый элемент. Представь очередь в поликлинике, и тут приходит какой-то чиновник и встаёт вперёди всех — вот этоunshift.splice(start, deleteCount, ...items)— это, блядь, швейцарский нож, универсальный солдат. Хочешь удалить элементы с какого-то места? Пожалуйста. Хочешь удалить и на их место новые вставить? Да без проблем, ёбана! Главное — координаты указать верно.sort(compareFn)/reverse()— первый всех построит по росту (или как скажешь), а второй просто развернёт шеренгу задом наперёд.sortбез функции сравнения — это отдельная песня, он строки сортирует, а числа может так переставить, что волосы дыбом встанут. Запомни это, как «Муму» Тургенева.
Вторая банда — интеллигенты в очках. Они с твоим массивом ничего плохого не делают. Берут, смотрят, что-то своё на его основе создают и отдают тебе новенькое, а твой исходник остаётся цел и невредим. Не мутирующие, красавчики.
slice(start, end)— фотограф. Делает снимок (копию) куска твоего массива. «Дай-ка мне, дружок, элементы с пятого по десятый». И даёт, не трогая оригинал.concat(...items)— строитель. Берёт твой массив, берёт ещё какие-то массивы или значения и склеивает их в один длинный-предлинный. Новый дом построил, старый стоит.map(callbackFn)— волшебник-преобразователь. Проходит по каждому элементу, колдует над ним (умножает на два, оборачивает в тег, делает имя заглавными буквами) и возвращает новый массив с результатами колдовства. Исходный массив — священная корова, её не трогают.filter(callbackFn)— вышибалa в клубе. Стоит на входе и проверяет каждого: «Ты чётный? Проходи. А ты больше пяти? Иди нахуй». И формирует новый массив только из тех, кого пропустил.
Ну и третья категория — сыщики и наблюдатели. Они ничего не меняют, ни нового не создают (ну, почти), а просто смотрят и докладывают.
find(callbackFn)/findIndex(callbackFn)— первый находит первый элемент, который подходит под условие, и говорит: «Вот он, держи». Второй не ленится и ещё индекс этого счастливчика называет.forEach(callbackFn)— это просто красивыйforцикл, переодетый в метод. Проходит по всем элементам и для каждого выполняет какую-то операцию. Результата не возвращает, просто делает дело.some(callbackFn)/every(callbackFn)— философы.someспрашивает: «Хотя бы один элемент условию соответствует?» Если да — говоритtrue.every— зануда: «А все ли, блядь, соответствуют?» Только если все — будетtrue.
Смотри, как это в деле выглядит, на живом примере:
const numbers = [1, 2, 3];
// Подходит мутант-отморозок и меняет всё
numbers.push(4); // numbers теперь [1, 2, 3, 4]. Исходник испорчен.
// А теперь работа интеллигентов
const doubled = numbers.map(x => x * 2); // [2, 4, 6, 8] — НОВЫЙ массив
const even = numbers.filter(x => x % 2 === 0); // [2, 4] — ещё один НОВЫЙ
const found = numbers.find(x => x > 2); // 3 — просто значение нашли
// И что мы видим? Исходный массив цел! Мутант его изменил, а интеллигенты — нет.
console.log(numbers); // [1, 2, 3, 4] — как после push и осталось
Вот и вся магия, ёпта. Главное — понимать, кто из этих методов бандит, а кто порядочный гражданин, чтобы потом не охуеть, куда делись твои данные.