← Назад к вопросам

Приведи пример немутирующих методов массива

1.7 Middle🔥 272 комментариев
#JavaScript Core

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Немутирующие методы массива в JavaScript

В JavaScript массивы имеют множество методов, которые можно разделить на две категории: мутирующие (изменяющие исходный массив) и немутирующие (не изменяющие исходный массив, возвращающие новый массив или значение). Немутирующие методы крайне важны в современном фронтенд-разработке, особенно при работе с состояниями в React, Vue или при соблюдении принципов функционального программирования, где избегают побочных эффектов.

Основные немутирующие методы массива

1. Методы, возвращающие новый массив

  • slice(start, end) – возвращает новый массив, содержащий элементы от индекса start до end (не включая end). Если аргументы не указаны, возвращает полную копию массива.
const original = [1, 2, 3, 4, 5];
const sliced = original.slice(1, 4); // [2, 3, 4]
console.log(original); // [1, 2, 3, 4, 5] – исходный массив не изменен
  • concat(...items) – объединяет исходный массив с другими массивами или значениями, возвращая новый массив.
const arr1 = [1, 2];
const arr2 = [3, 4];
const concatenated = arr1.concat(arr2, 5); // [1, 2, 3, 4, 5]
console.log(arr1); // [1, 2] – arr1 не изменен
  • map(callback) – создаёт новый массив, применяя функцию преобразования (callback) к каждому элементу исходного массива. Это один из самых часто используемых методов в React для рендеринга списков.
const numbers = [1, 2, 3];
const squared = numbers.map(num => num * num); // [1, 4, 9]
console.log(numbers); // [1, 2, 3]
  • filter(callback) – возвращает новый массив, содержащий только элементы, удовлетворяющие условию в функции callback.
const mixed = [1, 2, 3, 4, 5];
const evens = mixed.filter(num => num % 2 === 0); // [2, 4]
console.log(mixed); // [1, 2, 3, 4, 5]

2. Методы, возвращающие значение (не массив)

  • find(callback) – возвращает первый элемент, удовлетворяющий условию callback, или undefined если ничего не найдено.
const users = [{ id: 1 }, { id: 2 }, { id: 3 }];
const user = users.find(u => u.id === 2); // { id: 2 }
console.log(users); // исходный массив без изменений
  • findIndex(callback) – аналогично find, но возвращает индекс найденного элемента или -1.
const positions = [10, 20,了大量的 30];
const index = positions.findIndex(val => val > 15); // 1
console.log(positions); // [10, 20, 30]
  • indexOf(element) и lastIndexOf(element) – возвращают индекс первого или последнего вхождения элемента (по строгому равенству).
const letters = ['a', 'b', 'c', 'a'];
const firstA = letters.indexOf('a'); // 0
const lastA = letters.lastIndexOf('a'); // 3
  • includes(element) – проверяет наличие элемента в массиве, возвращает true или false.
const fruits = ['apple', 'banana'];
const hasBanana = fruits.includes('banana'); // true
  • every(callback) и some(callback) – проверяют, удовлетворяют все или хотя бы один элемент условию callback, возвращают булевое значение.
const scores = [85, 90, 78];
const allPassed = scores.every(score => score >= 70); // true
const anyExcellent = scores.some(score => score >= 90); // true
  • reduce(callback, initialValue) и reduceRight(callback, initialValue) – аккумулируют массив в одно значение (например, сумму чисел или объединение объектов). reduceRight работает аналогично, но начинается с конца массива.
const nums = [1, 2, 3];
const sum = nums.reduce((acc, curr) => acc + curr, 0); // 6

Преимущества использования немутирующих методов

  • Сохраняем исходные данные – особенно важно при работе с глобальным состоянием (Redux, Vuex) или пропсами в React, где изменение исходных данных может вызвать непредсказуемые побочные эффекты.
  • Упрощают тестирование – функции, использующие только немутирующие методы, легче тестировать, поскольку они не зависят от изменений внешних данных.
  • Поддержка функционального программирования – такие методы позволяют строить композиции функций и создавать чистые функции без побочных эффектов.
  • Упрощают отслеживание изменений – в современных фреймворках (например, React) изменение состояния через немутирующие операции позволяет эффективно сравнивать предыдущее и новое состояние для оптимизации рендеринга.

Пример комплексного использования

Рассмотрим типичную задачу фронтенд-разработки: преобразование списка пользователей с фильтрацией и добавлением новых полей.

const users = [
  { id: 1, name: 'Alice', age: 25 },
  { id: 2, name: 'Bob', age: 30 },
  { id: 3, name: 'Charlie', age: 22 }
];

// Немутирующая обработка: фильтрация + добавление поля
const adultUsersWithStatus = users
  .filter(user => user.age >= 18)        // новый массив только взрослых
  .map(user => ({
    ...user,                             // копия объекта (также немутирующая операция)
    status: 'active'
  }));

console.log(users); // исходный массив не изменён
console.log(adultUsersWithStatus); // новый массив с добавленным полем

В итоге, немутирующие методы являются фундаментальной частью работы фронтенд-разработчика, обеспечивая безопасность данных и соответствие современным парадигмам разработки. Их правильное использование помогает создавать более надежные, поддерживаемые и эффективные приложения.