Это хорошо работает:
["655971", "2343", "343"].map(function(x) { return parseInt(x) }) // [655971, 2343, 343]
Но это не делает:
["655971", "2343", "343"].map(parseInt) // [655971, NaN, NaN]
То же происходит для Array.filter ()
Что я пропускаю здесь?
Это потому, что map
передает в функцию обратного вызова больше аргументов, чем просто элемент массива. Вы получите:
callback(item, index, array)
Обычно ваша функция просто игнорирует аргументы, которые ей не нужны. Но parseInt
принимает необязательный второй параметр:
parseInt(string, base)
для первого вызова, base
- это индекс
0
. Это работает нормально, потому что ECMAScript определяет, что base = 0
то же самое, что и опускание аргумента, и, следовательно, допускает десятичное, восьмеричное или шестнадцатеричное (в данном случае использование десятичного числа).
Для второго и третьего элементов база
равна 1
или 2
. Он пытается проанализировать число как основание-1 (которого не существует) или основание-2 (двоичное). Поскольку первое число в строке - это цифра, которой нет в этих основаниях, вы получите NaN
.
В общем, parseInt
без базы в любом случае довольно сомнительный, так что вы, вероятно, захотите:
["655971", "2343", "343"].map(function(x) { return parseInt(x, 10) })
Проблема в том, что map
ожидает, что обратный вызов должен быть функцией, которая принимает три аргумента, callbackfn (значение, индекс, массив)
.
Второй аргумент конфликтует с аргументом radix
функции parseInt (string, radix)
.
Карта вызывает parseInt для каждого элемента следующим образом:
parseInt("655971",0); // 655971
parseInt("2343", 1); // NaN
parseInt("343", 2); // NaN
Первый работает, потому что если основание системы счисления не определено или равно 0, предполагается, что оно равно 10.
Array.Filter принимает функцию, которая возвращает информацию о том, удовлетворяет ли оцениваемый элемент условию. IsNumeric будет работать для того, что вы хотите.