Я знаю, что Lodash часто добавляет некоторые дополнительные проверки или тонкости к функциям, которые уже существуют в JavaScript, но неясно, что конкретно делает _.toNumber, чего я не получил бы с parseInt.
Я бы предпочел использовать Lodash только тогда, когда он дает преимущества, которых нет в существующих функциях JavaScript, но в данном случае я их не вижу.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


_.toNumber преобразует заданный ввод в число, если такое преобразование возможно, в противном случае возвращает NaN. Методы parseInt и parseFloat также работают одинаково (хотя первый будет возвращать только целые числа), однако они гораздо менее строги в своих правилах синтаксического анализа. _.toNumber значительно более ограничен.
Например, при одинаковом вводе '5.2a'parseInt вернет 5, parseFloat вернет 5.2, а _.toNumber вернет NaN. Первые два игнорируют все после первого нераспознанного символа и возвращают число, образованное всеми проанализированными символами до этого момента. Однако последний возвращает NaN, если встречается нераспознанный символ.
_.toNumber сравнима и функционально аналогична функции Number.
Я думаю, что гораздо лучше просто посмотреть на _.toNumber источник, и это практически ответит на ваш вопрос:
function toNumber(value) {
if (typeof value == 'number') {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject(value)) {
var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
value = isObject(other) ? (other + '') : other;
}
if (typeof value != 'string') {
return value === 0 ? value : +value;
}
value = value.replace(reTrim, '');
var isBinary = reIsBinary.test(value);
return (isBinary || reIsOctal.test(value))
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
: (reIsBadHex.test(value) ? NAN : +value);
}
Как видите, он делает кучу других вещей по сравнению с parseInt. Чтобы быть более конкретным:
console.info(_.toNumber(1), parseInt(1)) // same
console.info(_.toNumber('1'), parseInt('1')) // same
console.info(_.toNumber('b'), parseInt('b')) // same
console.info(_.toNumber({}), parseInt({})) // same
console.info(_.toNumber(' 1 '), parseInt(' 1 ')) // same
console.info(_.toNumber([1]), parseInt([1])) // same
console.info(_.toNumber(' 1a1 '), parseInt(' 1a1 ')) // NaN 1
console.info(_.toNumber([1,2]), parseInt([1,2])) // NaN 1
console.info(_.toNumber(false), parseInt(false)) // 0 NaN
console.info(_.toNumber(!0), parseInt(!0)) // 1 NaN
console.info(_.toNumber(!!0), parseInt(!!0)) // 0 NaN
console.info(_.toNumber(5e-324), parseInt(5e-324)) // 5e-324 5
console.info(_.toNumber(5.5), parseInt(5.5)) // 5.5 5
console.info(_.toNumber(null), parseInt(null)) // 0 NaN
console.info(_.toNumber(Infinity),parseInt(Infinity)) // Infinity NaN<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>Подводя итог, _.isNumber дает вам больше expected / consistent, и я бы сказал, safer результаты, когда дело доходит до синтаксического анализа ввода с массивами, десятичными знаками, ложные значения и строками. Он будет проверять весь ввод по сравнению с parseInt, который заботится только о первом действительном значении, как вы можете видеть из приведенных выше примеров. Он также лучше обрабатывает оператор отрицания (!) и т. д.
Так что в целом у него есть свое применение по сравнению с parseInt
Примечание: Подвох здесь заключается в том, что и _.toNumber, и parseInt возвращают NaN для undefined, что, учитывая, как _.toNumber справляется с остальными ложными значениями, можно было бы ожидать возврата 0 и NaN:
console.info(_.toNumber(undefined), parseInt(undefined)) // NaN NaN
Я хотел бы предложить исправление к приведенному выше ответу. Я думаю, это может ввести в заблуждение, говоря, что lodash toNumber дает более ожидаемые результаты. Пожалуйста, дополните ваши примеры следующими значениями: 10% 100$ $100 или любой другой символ валюты. И parseInt, и parseFloat обрабатывают их, как и следовало ожидать, где toNumber возвращает NaN.
Хороший вопрос, я должен был просто проверить источник для начала. Я сделаю это для будущих вопросов, подобных этому, потому что я всегда так думаю.