В чем разница между lodash toNumber и parseInt?

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
7 366
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

_.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

Хороший вопрос, я должен был просто проверить источник для начала. Я сделаю это для будущих вопросов, подобных этому, потому что я всегда так думаю.

Brady Dowling 12.06.2019 15:47

Я хотел бы предложить исправление к приведенному выше ответу. Я думаю, это может ввести в заблуждение, говоря, что lodash toNumber дает более ожидаемые результаты. Пожалуйста, дополните ваши примеры следующими значениями: 10% 100$ $100 или любой другой символ валюты. И parseInt, и parseFloat обрабатывают их, как и следовало ожидать, где toNumber возвращает NaN.

Nevararn 07.12.2020 12:46

Другие вопросы по теме