["1", "2", "111"].map(parseInt); // returns [1, NaN, 7]
Вы когда-нибудь пробовали передать parseInt
методу map
массива?
Если еще нет, я скажу, попробуйте сейчас. Это очень интересно.
Когда мы пробуем это в первый раз, это выглядит очень запутанно, но как только мы понимаем логику, все становится легко понять.
Чтобы понять, как это работает, нам нужно понять, как работают методы map
и parseInt
.
Метод карты массива
Он создает новый массив после выполнения функции обратного вызова для каждого элемента массива. В эту функцию обратного вызова передаются три параметра.
- Текущий объект
- Текущий индекс
- Исходный массив
В нашем случае эта функция обратного вызова — parseInt
. Таким образом, parseInt
будет вызываться для каждого элемента массива, и его результат будет добавлен во вновь созданный массив.
Отсюда наш код
["1", "2", "111"].map(parseInt);
будет выполняться как
parseInt("1", 0, ["1", "2", "111"]); // 1 parseInt("2", 1, ["1", "2", "111"]); // NaN parseInt("111", 2, ["1", "2", "111"]); // 7
метод parseInt
Метод parseInt
используется для преобразования строки в целое число. Мы могли бы использовать этот метод много раз, но без использования его второго (необязательного) параметра. Этот второй параметр используется для указания системы счисления.
Поэтому, когда вызывается parseInt("1", 0, ["1", "2", "111"]);
, он пытается преобразовать "1"
в целое число с основанием 0, поэтому возвращает 1
.
Точно так же parseInt("2", 1, ["1", "2", "111"]);
пытается преобразовать "2"
в целое число с основанием 1, поэтому возвращает NaN
.
Точно так же parseInt("111", 2, ["1", "2", "111"]);
пытается преобразовать "111"
в целое число с основанием 2, поэтому возвращает 7
.
Следовательно, ["1", "2", "111"].map(parseInt);
возвращает [1, NaN, 7]
Вывод
parseInt
может оказаться сложным, если его передать функциям более высокого порядка, таким как map
в Array. Мы должны проявлять особую осторожность при передаче parseInt
в качестве функции обратного вызова.