Что всегда возвращает метод `Array.prototype.map` в JavaScript?

Ответ

Метод map всегда возвращает новый массив. Длина нового массива всегда равна длине исходного. Каждый элемент нового массива — это результат вызова предоставленной callback-функции на соответствующем элементе исходного массива.

Базовый пример:

const numbers = [1, 2, 3];
const squares = numbers.map(num => num * num);
console.log(squares); // [1, 4, 9]
console.log(numbers === squares); // false (это новый массив)

Важные технические детали:

  1. Возврат undefined: Если callback-функция не возвращает значение явно, в новом массиве будет undefined.

    const result = [1, 2].map(num => {
        const doubled = num * 2;
        // Забыли return
    });
    console.log(result); // [undefined, undefined]
  2. Исходный массив не изменяется: map является чистой функцией (pure function) и не мутирует исходный массив. Однако, если элементы — объекты, они копируются по ссылке.

    const users = [{ name: 'Alice' }, { name: 'Bob' }];
    const usersWithId = users.map((user, index) => ({
        ...user, // Создаём поверхностную копию объекта
        id: index
    }));
    users[0].name = 'Carol';
    console.log(usersWithId[0].name); // 'Alice' (не изменилось)
  3. Обработка пустых элементов: map вызывает callback только для индексов, которым присвоено значение (включая undefined). Он пропускает пустые элементы (empty slots) в разреженных массивах.

    const sparseArray = [1, , 3]; // Второй элемент — empty
    const mapped = sparseArray.map((x, i) => {
        console.log(`Index ${i}: ${x}`); // Index 0: 1, Index 2: 3
        return x;
    });
    console.log(mapped); // [1, empty, 3]

Используйте map, когда нужно трансформировать каждый элемент массива и получить новый массив результатов.

Ответ 18+ 🔞

А, ну вот, смотри, про этот ваш map, блядь. Это ж самая простая хуйня, если разобраться, но народ постоянно в неё втыкается, как баран в новые ворота. Суть в том, что он, этот map, всегда, блядь, возвращает новый массив, ёпта! Не старый, не переписанный, а новый, свеженасранный. И длина у него будет один в один, как у исходного. А что внутри? А внутри — результаты того, что твоя колбэк-функция наваяла на каждом элементе старого массива.

Смотри, как это просто, на примере:

const numbers = [1, 2, 3];
const squares = numbers.map(num => num * num);
console.log(squares); // [1, 4, 9]
console.log(numbers === squares); // false (это новый массив, ёпта!)

А теперь, блядь, технические подводные камни, на которых все и спотыкаются:

  1. А где, сука, return? Если твоя функция нихуя не возвращает, то в новом массиве будет красота — undefined. Во все дыры.

    const result = [1, 2].map(num => {
        const doubled = num * 2;
        // Забыли return, блядь! И чё?
    });
    console.log(result); // [undefined, undefined] — вот и весь сказ, пизда.
  2. Исходный массив не трогает! Это святое, блядь, map — чистая функция, он не мудак, чтобы портить то, с чем работал. Но! Если внутри массива лежат объекты, то они копируются по ссылке, ёбта. Хочешь, чтобы не менялись — делай копию, хитрая жопа.

    const users = [{ name: 'Alice' }, { name: 'Bob' }];
    const usersWithId = users.map((user, index) => ({
        ...user, // Вот, блядь, поверхностную копию делаем, чтоб не было сюрпризов
        id: index
    }));
    users[0].name = 'Carol'; // Меняем исходник
    console.log(usersWithId[0].name); // 'Alice' (а тут нихуя не изменилось, ура!)
  3. А с дырками в массиве что? Вот это, блядь, интересно. map работает только с тем, что есть. Пустые места (empty slots) он просто игнорирует, как будто их и нет. Не вызывает для них колбэк, сука, вообще.

    const sparseArray = [1, , 3]; // Второй элемент — пустота, пиздец.
    const mapped = sparseArray.map((x, i) => {
        console.log(`Index ${i}: ${x}`); // Index 0: 1, Index 2: 3. Второй индекс — в рот меня чих-пых, его нет!
        return x;
    });
    console.log(mapped); // [1, empty, 3] — дырка так и осталась дыркой.

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