Вопрос

 ['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 быть меньше системного номера?

  1. Первые два разбора нормальные. Почему на выходе третья parseInt(‘125’, 5) = 7. Я обнаружил, что она автоматически удалила последнюю 5, а на самом деле на выходе parseInt(‘12’, 5), поэтому на выходе равно 7.
  2. Почему четвертый вывод - NaN, потому что строка параметра начинается с 5, что не соответствует номеру, принадлежащему системе, поэтому возвращается NaN напрямую.
  3. Последний напрямую удаляет 55 и, наконец, анализирует его на parseInt(‘1’, 5) и выводит 1.

Заключение

  1. Если первое значение строки первого параметра больше или равно основанию второго параметра, то возвращается NaN напрямую.
  2. Если первое значение первой строки параметра соответствует условиям, а другие значения им не соответствуют, значения, не соответствующие условиям, в конце будут проигнорированы, а затем будет выполнен расчет.

Дополнительные упражнения

//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 . Заинтересованы в хакинге роста? Ознакомьтесь с разделом Схема.