【问题标题】:What's the difference between lodash toNumber and parseInt?lodash toNumber 和 parseInt 有什么区别?
【发布时间】:2019-06-11 19:03:53
【问题描述】:

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

我宁愿只在 Lodash 提供现有 JavaScript 函数所没有的好处时才使用它,但在这种情况下我看不到任何好处。

【问题讨论】:

    标签: javascript lodash parseint


    【解决方案1】:

    我认为简单地查看_.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 在解析输入与数组、小数、假值 和字符串时的结果。它会检查整个输入 vs parseInt,它只关心第一个有效值,正如您从上面的示例中看到的那样。它还可以更好地处理否定运算符 (!) 等。

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

    注意:这里有个问题是_.toNumberparseInt 都为undefined 返回NaN,考虑到_.toNumber 如何处理其余的假值一期望返回0 vs NaN

    console.log(_.toNumber(undefined), parseInt(undefined))  // NaN NaN
    

    【讨论】:

    • 好点,我应该刚开始检查源。我会为以后这样的 lodash 问题这样做,因为我总是这样想。
    • 我想建议对上述答案进行更正。我认为说 lodash toNumber 给出更多预期结果可能会产生误导。请使用以下值扩展您的示例:10% 100$ $100 或任何其他货币字符。 parseInt 和 parseFloat 都按预期处理它们,其中 toNumber 返回 NaN。
    【解决方案2】:

    _.toNumber 将给定的输入转换为数字(如果可以进行这种转换),否则返回 NaNparseIntparseFloat 方法也以相同的方式工作(尽管前者只会返回整数),但是它们的解析规则要宽松得多。 _.toNumber 的限制明显更多。

    例如,对于相同的输入 '5.2a'parseInt 将返回 5parseFloat 将返回 5.2_.toNumber 将返回 NaN。前两个忽略第一个无法识别的字符之后的所有内容,并返回由所有已解析字符组成的数字直到该点。但是,如果遇到无法识别的字符,最后一个返回 NaN。

    _.toNumberNumber 功能相当且功能相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-27
      • 2018-07-28
      • 2011-06-01
      • 2017-03-21
      • 2010-10-05
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多