Вот вам вопрос,
Как вы думаете, что будет на выходе следующей программы?

let arr = ["11", "12", "13"];
console.log(arr.map(parseInt));

Попробуйте найти результат, не выполняя поиск в Google или фактически запуская его на консоли: p

Кажется, что вывод будет [11, 12, 13], то есть все элементы будут преобразованы в Int, не так ли?
Теперь то же самое консоль, вы обнаружите, что точный вывод [11, NaN, 1].
Странно, не правда ли?

Что ж, попробуем выяснить, почему.

Есть несколько вещей, которые нам нужно знать, прежде чем мы полностью это поймем.

  1. Если мы вызываем функцию в javascript с большим количеством аргументов, чем требуется, она в основном их игнорирует.
    Например, рассмотрим функцию fun(a, b){}, которая принимает 2 аргументы, и вы вызываете функцию с более чем двумя аргументами, скажем, fun(x, y, z); она игнорирует все остальные аргументы, кроме первых двух, поэтому она будет читать x и y, но игнорировать z.
  2. Array.map по умолчанию передает 3 аргумента переданной в него функции, эти 3 аргумента — текущее значение итерации, текущий индекс итерации и весь массив.
  3. parseInt принимает 2 аргумента, первый — это значение в строковом формате, а второй — основание счисления, основание — это не что иное, как система счисления, в которую оно будет преобразовывать значение, например, parseInt("10", 10) даст 10, так как 10 в десятичной системе счисления равно 10, но parseInt("10", 2) даст 2, так как 10 в 2 система счисления равна 2.
    Примечание. Если значение системы счисления не передается или в систему счисления передается какое-либо значение false, оно будет считаться числом 10. система по умолчанию.
  4. parseInt считывает значение слева и читает до тех пор, пока не сможет распознать его в предоставленной системе счисления счисления.
    например, parseInt("11ManUnited") даст 11 до 11, число распознается в 10-й системе счисления.

Теперь давайте попробуем решить нашу проблему, не забывая об этих четырех вещах.

Первая итерация

Array.map будет передавать «11» (фактическое значение), 0 (текущий индекс) и [«11», «12», «13»] (весь массив) в parseInt, но parseInt принимает только 2 параметра. , так что в основном это parseInt("11", 0), который вернет 11, поскольку 0 является ложным значением, поэтому по умолчанию он преобразует "11" в систему счисления 10, которая равна 11.

Вторая итерация

Передаваемые значения будут "12", 1, ["11", "12", "13"]
Итак, parseInt("12", 1), теперь "12" не распознается в 1 системе счисления , так что это приведет к NaN.

Третья итерация

Передаваемые значения будут "13", 2, ["11", "12", "13"]
Итак, parseInt("13", 1), теперь "13" в 2-й системе счисления равно 1 , 2 система счисления не может распознать 3, но может прочитать 1 (пункт 4).

Итак, в результате мы получим [11, NaN, 1].

Вывод на первый взгляд выглядит странно, но не за это ли мы любим JavaScript :D