Функция parseInt и map массива
Недавно наткнулся на такую особенность сочетания Map массива и функции ParseInt.
Это:
["1x", "2x", "3x"].map(window.parseInt);
Выводит [1, NaN, NaN]
А это:
["1x", "2x", "3x"].map(function() {return window.parseInt(arguments[0])});
Выводит [1, 2, 3]
Почему первый вариант работает некорректно?
.map() принимает три параметра (element, index, array)
в этом примере ["1x", "2x", "3x"].map(window.parseInt);
ты вынужден передать в parseInt не только строки, но и их индексы в массиве.
Это связано с тем, что .parseInt() принимает два параметра (string, radix)
таким образом ты получаешь следующее:
parseInt('1x', 0);
parseInt('2x', 1);
parseInt('3x', 2);
поэтому результат [1, NaN, NaN]
1) если тебе нужен именно parseInt.
поскольку надо всё равно указать radix, ты можешь написать функцию
const parseInt10 = (x) => Number.parseInt(x, 10);
или по старинке
function parseInt10(x) {
return Number.parseInt(x, 10);
}
и затем
["1x", "2x", "3x"].map(parseInt10);
2) можно использовать parseFloat (он принимает один аргумент)
["1x", "2x", "3x"].map(parseFloat);
можешь поиграться здесь https://repl.it/ExE4
map, если я понимаю, передаёт вторым параметром индекс элемента в массиве, а parseInt ко второму параметру может как-то по-особенному относиться. Ему лучше один передавать. Второй, как помню, основание системы счисления. У тебя наверное выходит 2 в одноричной системе и 3 в двоичной.