Подтвердить что ты не робот

Что случилось с parseInt?

Возможный дубликат:
javascript - Array.map и parseInt

Я наткнулся на следующий фрагмент кода:

> ['10','10','10','10','10'].map(parseInt);
[10, NaN, 2, 3, 4]

Что здесь происходит?

4b9b3361

Ответ 1

Начните с консультации по документации 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"

и т.д.

Ответ 2

От Документ MDN:

parseInt часто используется с одним аргументом, но занимает два. Второй - это радикс Для функции обратного вызова Array.prototype.map передает 3 аргумента: элемент, индекс, массив Третий аргумент игнорируется parseInt, но не второй, поэтому возможная путаница.

Таким образом, на ваш parseInt передаются следующие значения:

// 1st run:
parseInt( '10', 0 );
// 2nd run:
parseInt( '10', 1 );
// etc.

Таким образом, вы каждый раз используете разное основание, что приводит к результатам.