Возможный дубликат:
javascript - Array.map и parseInt
Я наткнулся на следующий фрагмент кода:
> ['10','10','10','10','10'].map(parseInt);
[10, NaN, 2, 3, 4]
Что здесь происходит?
Возможный дубликат:
javascript - Array.map и parseInt
Я наткнулся на следующий фрагмент кода:
> ['10','10','10','10','10'].map(parseInt);
[10, NaN, 2, 3, 4]
Что здесь происходит?
Начните с консультации по документации Array.prototype.map. Ключ - это строка:
обратный вызов вызывается с тремя аргументами: значением элемента, индексом элемента и объектом массива, пройденным.
(акцент мой)
Затем проверьте документацию parseInt:
Функция parseInt преобразует свой первый аргумент в строку, анализирует его и возвращает целое число или NaN. Если не NaN, возвращаемое значение будет десятичным целочисленным представлением первого аргумента, принятого как число в указанном базисе (base). Например, радиус 10 указывает на преобразование из десятичного числа, 8 восьмеричных, 16 шестнадцатеричных и т.д. Для радиусов выше 10 буквы алфавита указывают цифры более 9. Например, для шестнадцатеричных чисел (основание 16) используются от A до F.
и
Если radix равен undefined или 0, JavaScript предполагает следующее:
Если входная строка начинается с "0x" или "0X", радиус равен 16 (шестнадцатеричный).
Если входная строка начинается с "0", радиус равен восьми (восьмеричный). Эта функция нестандартна, и некоторые реализации намеренно не поддерживают ее (вместо этого используют radix 10). По этой причине всегда указывайте radix при использовании parseInt.
Если начальная строка начинается с любого другого значения, то радиус равен 10 (десятичный).
Итак, первый вызов:
parseInt('10',0, ['10','10',...]) // => 10 (because radix=0)
второе:
parseInt('10',1, ['10','10',...]) // => NaN because radix is 1
третий:
parseInt('10',2, ['10','10',...]) // => 2 because 10 in binary is the number "2"
и т.д.
От Документ MDN:
parseInt часто используется с одним аргументом, но занимает два. Второй - это радикс Для функции обратного вызова Array.prototype.map передает 3 аргумента: элемент, индекс, массив Третий аргумент игнорируется parseInt, но не второй, поэтому возможная путаница.
Таким образом, на ваш parseInt
передаются следующие значения:
// 1st run:
parseInt( '10', 0 );
// 2nd run:
parseInt( '10', 1 );
// etc.
Таким образом, вы каждый раз используете разное основание, что приводит к результатам.