lodash toNumber 和 parseInt 有什么区别?
What's the difference between lodash toNumber and parseInt?
我知道 Lodash 经常为 JavaScript 中已经存在的函数添加一些额外的检查或细节,但不清楚 _.toNumber
具体做了什么我不会用 parseInt
.
我更愿意仅在 Lodash 提供现有 JavaScript 功能所没有的好处时才使用 Lodash,但在这种情况下我看不到任何好处。
如果可以进行这种转换,_.toNumber
将给定输入转换为数字,否则 returns NaN
。 parseInt
和 parseFloat
方法也以相同的方式工作(虽然前者只会 return 整数),但是,它们的解析规则要宽松得多。 _.toNumber 限制明显更多。
例如,对于相同的输入 '5.2a'
,parseInt
将 return 5
,parseFloat
将 return 5.2
,而 _.toNumber
会 return NaN
。前两个忽略第一个无法识别的字符和 return 之前所有已解析字符形成的数字之后的所有内容。如果遇到无法识别的字符,最后一个 returns NaN。
_.toNumber
与 Number
函数具有可比性且功能相同。
我认为简单地看一下 _.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
注意:这里的陷阱是 _.toNumber
和 parseInt
return NaN
for undefined
考虑到 _.toNumber
如何处理人们期望 return 0
与 NaN
:
的其余虚假值
console.log(_.toNumber(undefined), parseInt(undefined)) // NaN NaN
我知道 Lodash 经常为 JavaScript 中已经存在的函数添加一些额外的检查或细节,但不清楚 _.toNumber
具体做了什么我不会用 parseInt
.
我更愿意仅在 Lodash 提供现有 JavaScript 功能所没有的好处时才使用 Lodash,但在这种情况下我看不到任何好处。
_.toNumber
将给定输入转换为数字,否则 returns NaN
。 parseInt
和 parseFloat
方法也以相同的方式工作(虽然前者只会 return 整数),但是,它们的解析规则要宽松得多。 _.toNumber 限制明显更多。
例如,对于相同的输入 '5.2a'
,parseInt
将 return 5
,parseFloat
将 return 5.2
,而 _.toNumber
会 return NaN
。前两个忽略第一个无法识别的字符和 return 之前所有已解析字符形成的数字之后的所有内容。如果遇到无法识别的字符,最后一个 returns NaN。
_.toNumber
与 Number
函数具有可比性且功能相同。
我认为简单地看一下 _.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
注意:这里的陷阱是 _.toNumber
和 parseInt
return NaN
for undefined
考虑到 _.toNumber
如何处理人们期望 return 0
与 NaN
:
console.log(_.toNumber(undefined), parseInt(undefined)) // NaN NaN