Часто задаваемые вопросы об интервью с интернет-знаменитостями ['1','2','3'].map(parseInt) принципиальный анализ

JavaScript

1. console.log(['1','2','3'].map(parseInt));

Авторитетная оригинальная ссылка Опасность необязательных аргументов JavaScript

  • Ответ: [1,NaN,NaN]

  • Анализ: я знаю ответ на этот вопрос, потому что этот вопрос网红题Чтобы проанализировать его, давайте посмотрим

отобразить этот метод он или вернуться调函数的参数, и его использование

//这是MDN
var array1 = [1, 4, 9, 16];
// pass a function to map
const map1 = array1.map(x => x * 2);

console.log(map1);
// expected output: Array [2, 8, 18, 32]
  • грамматика
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
 // Return element for new_array }[, 
thisArg])
  • параметр

  • callback

Функция, которая генерирует новый элемент массива, используя три аргумента:

  • currentValue

    callbackТекущий элемент обрабатываемого массива.

  • **indexнеобязательный**看到这里先注意起来这个参数,思考一下

    callbackИндекс текущего элемента в обрабатываемом массиве.

  • arrayнеобязательный

    callback mapМассив методов для вызова.

thisArgнеобязательный

воплощать в жизньcallbackИспользуется при функцияхthisстоимость.

  • map также является очень полезным методом прототипа массива, всем он знаком, так что теперь давайте посмотримparseInt,Сюда

что они зажгут

причина

  • Обратите внимание на двух парней выше, далее легко объяснить
  • Причина: СобственноmapизcallbackВторой параметр index, который является индексом текущего элемента, принимается какparseIntвторой параметрradixиспользовать

Подумайте об этом, мы изначально думали, что наши три звонка были такими

parseInt('1')
parseInt('2')
parseInt('3')

на самом деле так называется

parseInt('1',0,theArray);
parseInt('2',1,theArray);
parseInt('3',2,theArray);

Итак, вот и вопрос, как индекс влияет на систему счисления?

  • В первый раз, когда я впервые назвал это так:parseInt('1',0)Это не проблема. Преобразуйте его в десятичное число. Посмотрите на картинку в моей красной рамке.

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

  • В третий раз в качестве базы используется 2. Это означает, что строка будет разобрана как количество байтов, т.е. содержащая только значения 0 и 1. Шаг 11 спецификации для parseInt гласит, что он пытается проанализировать только левую часть первого символа, который еще не является допустимым числом, для которого требуется основание. Первый символ этой строки — «3», что не является допустимым числом по основанию 2. Таким образом, эта подстрока будет проанализирована как пустая. Шаг 12 гласит: если подстрока анализируется как пустая, функция вернет NaN.

    • Таким образом, результат здесь должен быть [1,NaN,NaN].

решить

Проблема здесь в том, что легко упустить из виду, что для parseInt требуются два параметра. В карте есть три параметра. Таким образом, комбинация здесь приводит к вышеуказанной проблеме.Напишите по-другому:

['1','2','3'].map(function(value){
        return parseInt(value)
})

Таким образом, вы не ошибетесь.

Конечно, мы также можем написать:

['1','2','3'].map(Number)


На этом все закончилось, продолжу позже