JavaScript: map и parseInt
объясняем, почему сочетание map и parseInt в JavaScript может вызвать недоумение
В JavaScript результат вызова функции ['1', '5', '11'].map(parseInt) может сильно озадачить.
console.log(['1', '5', '11'].map(parseInt))
Результат:
[1, NaN, 3]
Чтобы понять, почему происходит именно так, необходимо погрузиться в особенности взаимодействия map и parseInt.
map
Метод map применяет к каждому элементу массива указанную функцию. При этом в качестве аргумента map передаёт указанной функции три аргумента: элемент массива, его индекс и сам массив, по которому осуществляется проход.
parseInt
Функция parseInt() принимает строку sting в качестве аргумента и возвращает целое число в соответствии с указанным основанием системы счисления radix (целое число в диапазоне от 2 до 36). В случе неудачи parseInt возвращает NaN.
Взаимодействие
При использовании parseInt в map метод map передает индекс элемента в качестве второго аргумента parseInt, что приводит к неожиданному результату:
- Для первого элемента массива ‘1’ (индекс 0) вызывается
parseInt('1', 0). Основание 0 означает, что основание угадывается на основе формата строки, по умолчанию 10. Результат: 1. - Для второго элемента массива ‘5’ (индекс 1) вызывается
parseInt('5', 1). Но 1 не является допустимым основанием, поэтому результатом является NaN. - Для третьего элемента ‘11’ (индекс 2) вызывается
parseInt('11', 2). Здесь 2 означает двоичный. Допустимые двоичные цифры — 1, что дает 3 (так как 1*2^1 + 1*2^0 = 3).
Решение
Чтобы parseInt гарантированно получал только элемент массива, можно использовать стрелочную функцию:
console.log(['1', '5', '11'].map(num => parseInt(num))); // [1, 5, 11]
или конструктор Number:
console.log(['1', '5', '11'].map(Number)); // [1, 5, 11]
Данный пример демонстрирует, насколько важно знать, как взаимодействуют функции в JavaScript и насколько важно уметь передавать функциям именно необходимые параметры.
Спасибо за внимание.
