Из Сети разработчиков Mozilla :
[1,4,9].map(Math.sqrt)
даст:
[1,2,3]
Почему тогда это так:
['1','2','3'].map(parseInt)
дать это:
[1, NaN, NaN]
Я тестировал в Firefox 3.0.1 и Chrome 0.3 и, как заявление об отказе от ответственности, я знаю, что это не кросс-браузерная функциональность (нет IE).
Я узнал, что следующее достигнет желаемого эффекта. Однако, это все еще не объясняет странное поведение parseInt
.
['1','2','3'].map(function(i){return +i;}) // returns [1,2,3]
javascript
штифтик
источник
источник
.map(parseFloat)
потому что он принимает только один параметр..map(Number)
.Ответы:
Функция обратного вызова в
Array.map
имеет три параметра:С той же страницы Mozilla, на которую вы ссылались:
Так что если вы вызываете функцию,
parseInt
которая на самом деле ожидает два аргумента, вторым аргументом будет индекс элемента.В этом случае вы в конечном итоге коллировали
parseInt
с основанием 0, 1 и 2 по очереди. Первый - это то же самое, что не предоставлять параметр, поэтому он устанавливается по умолчанию на основе входных данных (в данном случае база 10). База 1 - это невозможная база чисел, а 3 - недопустимое число в базе 2:Так что в этом случае вам нужна функция обертки:
или с синтаксисом ES2015 +:
(В обоих случаях лучше явно указывать основание,
parseInt
как показано на рисунке, потому что в противном случае оно угадывает основание на основе входных данных. В некоторых старых браузерах ведущий 0 заставлял его угадать восьмеричное, что, как правило, проблематично. угадайте hex, если строка начинается с0x
.)источник
map
передает 2-й аргумент, который (во многих случаях) портитparseInt
радикальный параметр.Если вы используете подчеркивание, вы можете сделать:
['10','1','100'].map(_.partial(parseInt, _, 10))
Или без подчеркивания:
['10','1','100'].map(function(x) { return parseInt(x, 10); });
источник
Вы можете решить эту проблему, используя Number в качестве функции iteratee:
Без нового оператора Number можно использовать для преобразования типов. Однако он отличается от parseInt: он не анализирует строку и возвращает NaN, если число не может быть преобразовано. Например:
источник
Готов поспорить, что со вторым параметром parseInt, radix, происходит нечто странное. Почему он ломается с использованием Array.map, а не когда вы вызываете его напрямую, я не знаю.
источник
Вы можете использовать функцию стрелки ES2015 / ES6 и просто передать число в parseInt. Значение по умолчанию для radix будет 10
Или вы можете явно указать radix для лучшей читабельности вашего кода.
В приведенном выше примере radix явно установлен на 10
источник
другое (рабочее) быстрое исправление:
источник
parseInt
ИМХО следует избегать именно по этой причине. Вы можете обернуть его, чтобы сделать его более безопасным в следующих ситуациях:Заголовки lodash / fp итерируют аргументы в 1 по умолчанию, чтобы избежать этих ошибок. Лично я нашел эти обходные пути, чтобы создать столько ошибок, сколько они избегают.
parseInt
Я думаю, что занесение в черный список в пользу более безопасной реализации - лучший подход.источник