lodash toNumber 和 parseInt 有什么区别?

What's the difference between lodash toNumber and parseInt?

我知道 Lodash 经常为 JavaScript 中已经存在的函数添加一些额外的检查或细节,但不清楚 _.toNumber 具体做了什么我不会用 parseInt .

我更愿意仅在 Lodash 提供现有 JavaScript 功能所没有的好处时才使用 Lodash,但在这种情况下我看不到任何好处。

如果可以进行这种转换,

_.toNumber 将给定输入转换为数字,否则 returns NaNparseIntparseFloat 方法也以相同的方式工作(虽然前者只会 return 整数),但是,它们的解析规则要宽松得多。 _.toNumber 限制明显更多。

例如,对于相同的输入 '5.2a'parseInt 将 return 5parseFloat 将 return 5.2 ,而 _.toNumber 会 return NaN。前两个忽略第一个无法识别的字符和 return 之前所有已解析字符形成的数字之后的所有内容。如果遇到无法识别的字符,最后一个 returns NaN。

_.toNumberNumber 函数具有可比性且功能相同。

我认为简单地看一下 _.toNumber source 会更好,这实际上可以回答您的问题:

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.log(_.toNumber(1),       parseInt(1))        // same 
console.log(_.toNumber('1'),     parseInt('1'))      // same  
console.log(_.toNumber('b'),     parseInt('b'))      // same  
console.log(_.toNumber({}),      parseInt({}))       // same 
console.log(_.toNumber(' 1 '),   parseInt(' 1 '))    // same
console.log(_.toNumber([1]),     parseInt([1]))      // same
console.log(_.toNumber(' 1a1 '), parseInt(' 1a1 '))  // NaN      1
console.log(_.toNumber([1,2]),   parseInt([1,2]))    // NaN      1
console.log(_.toNumber(false),   parseInt(false))    // 0        NaN
console.log(_.toNumber(!0),      parseInt(!0))       // 1        NaN
console.log(_.toNumber(!!0),     parseInt(!!0))      // 0        NaN
console.log(_.toNumber(5e-324),  parseInt(5e-324))   // 5e-324   5
console.log(_.toNumber(5.5),     parseInt(5.5))      // 5.5      5
console.log(_.toNumber(null),    parseInt(null))     // 0        NaN
console.log(_.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 相比,后者只关心第一个有效值,正如您从上面的示例中看到的那样。它还能更好地处理否定运算符 (!) 等

所以总的来说它确实有它的用途 vs parseInt

注意:这里的陷阱是 _.toNumberparseInt return NaN for undefined 考虑到 _.toNumber 如何处理人们期望 return 0NaN:

的其余虚假值
console.log(_.toNumber(undefined), parseInt(undefined))  // NaN NaN