Вопрос
['1', '2', '3'].map(parseInt)
Каков результат? Некоторые люди могут придумать ответ: [1, 2, 3], что на самом деле является неправильным ответом. Посмотрим правильный ответ под распечаткой консоли:
На самом деле: [1, NaN, NaN],
некоторым людям любопытно, почему он выводит [1, NaN, NaN]
вместо [1, 2, 3]
.
Давайте посмотрим вопрос
['1', '2', '3'].map(parseInt)
У вас может возникнуть много вопросов о map(parseInt)
, зачем кодировать это? На самом деле это стенография, готовый код выглядит следующим образом
['1', '2', '3'].map((v, i, arr) => parseInt(v, i))
map():
Это функция обратного вызова с тремя параметрами: текущее значение (v)
, индекс (i)
и исходный массив (arr)
. Порядок выполнения: [‘1’, ‘2’, ‘3’].map((v, i, arr) => parseInt(v, i))
, вывод по порядку
parseInt('1', 0) // 1
parseInt('2', 1) // NaN
parseInt('3', 2) // NaN
Итак, вопрос приходит к pareInt
, почему приводят к этим ответам?
parseInt
Кто-то задается вопросом, почему первый вывод 1
, а второй и третий NaN
, так что давайте официально вступим в сегодняшнюю тему.
Что такое парсеинт?
Функция
parseInt()
анализирует строковый аргумент и возвращает целое число указанного основания счисления (основания в математических системах счисления).
Основание: целое число от
2
до36
, представляющее основание (основание в математических системах счисления) числаstring
.
Ссылка: developer.mozilla.org
Итак, второй параметр parseInt
— это математические системы счисления, но он также указывает число от 2 до 36 в этой системе.
почему parseInt(‘1’, 0)
равно 1?
Скриншот из MDN на parseInt
Таким образом, 0 будет считаться десятичным, поэтому parseInt(‘1’, 0)
равно 1.
почему parseInt(‘2’, 1)
равно NaN?
Строка первого параметра parseInt меньше, чем основание второго параметра.
почему parseInt(‘3’, 2)
равно NaN?
Причина та же, что и выше.
Подробнее о parseInt
Согласно выводу, добавим в массив еще строк, посмотрим:
Соответствующие значения нижнего индекса между массивами ‘2’,…’9
' равны 1~8
, а первый параметр больше второго, поэтому все они NaN
Тогда почему parseInt(‘10’, 9)
выводит 9
вместо NaN, когда первый параметр равен «10», а система равна 9.
Согласно предыдущему описанию системы, реальное число, представленное системой 9, находится в диапазоне от 0 до 8. Первый параметр будет разбираться в строки один за другим независимо от того, обрабатывается ли входящая строка или число, поэтому ‘1’
и ‘0’
принадлежат к действительным числам от 0 до 8 в 9 системе.
Он рассчитывается, как показано ниже:
parseInt('10', 9) = 0 * Math.pow(9, 0) + 1 * Math.pow(9, 1) = 9 parseInt('11', 10) = 1* Math.pow(10, 0) + 1 * Math.pow(10, 1) = 11 parseInt('12', 11) = 2* Math.pow(11, 0) + 1* Math.pow(11, 1) = 13 parseInt('13', 12) = 3* Math.pow(12, 0) + 1* Math.pow(12, 1) = 15 parseInt('14', 13) = 4* Math.pow(13, 0) + 1* Math.pow(13, 1) = 17 parseInt('15', 14) = 5* Math.pow(14, 0) + 1* Math.pow(14, 1) = 19
Давайте попробуем еще несколько, зная, что,
parseInt('4123', 5); // 538 4*Math.pow(5, 3) + 1*Math.pow(5, 2) + 2*Math.pow(5, 1) + 3*Math.pow(5, 0) // 538 parseInt('764', 8); // 500 7*Math.pow(8, 2) + 6*Math.pow(8, 1) + 4*Math.pow(8, 0); // 500
Подробнее о parseInt
Должен ли реальный номер первой строки параметров parseInt
быть меньше системного номера?
- Первые два разбора нормальные. Почему на выходе третья
parseInt(‘125’, 5) = 7
. Я обнаружил, что она автоматически удалила последнюю5
, а на самом деле на выходеparseInt(‘12’, 5)
, поэтому на выходе равно7
. - Почему четвертый вывод -
NaN
, потому что строка параметра начинается с5
, что не соответствует номеру, принадлежащему системе, поэтому возвращаетсяNaN
напрямую. - Последний напрямую удаляет
55
и, наконец, анализирует его наparseInt(‘1’, 5)
и выводит1
.
Заключение
- Если первое значение строки первого параметра больше или равно основанию второго параметра, то возвращается
NaN
напрямую. - Если первое значение первой строки параметра соответствует условиям, а другие значения им не соответствуют, значения, не соответствующие условиям, в конце будут проигнорированы, а затем будет выполнен расчет.
Дополнительные упражнения
//what's the output of two line code ['10', '10', '10', '10'].map(parseInt); ['1', '2', '3'].map(Number)
Окончательно
Спасибо, что прочитали. С нетерпениемс нетерпением жду ваших подписчиков и новых статей высокого качества.
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord . Заинтересованы в хакинге роста? Ознакомьтесь с разделом Схема.