在将字符串转换为数字时,parseInt()和Number()的行为如何不同?
当前回答
如果你正在寻找性能,那么最好的结果可能是按位右移“10”>>0。也可以乘(“10”* 1)或not not(~~“10”)。它们都比Number和parseInt快得多。 他们甚至有“feature”为非数字参数返回0。 下面是性能测试。
其他回答
我总是使用parseInt,但要注意前导零会迫使它进入八进制模式。
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
前两个将提供更好的性能,因为它返回一个原语而不是一个对象。
嗯,它们在语义上是不同的,作为函数调用的Number构造函数执行类型转换,而parseInt执行解析,例如:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
此外,parseInt将忽略与当前使用的基数中任何数字不对应的尾随字符。
Number构造函数不检测隐式八进制,但可以检测显式八进制符号:
Number("010"); // 10
Number("0o10") // 8, explicit octal
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
它可以处理十六进制的数字,就像parseInt一样:
Number("0xF"); // 15
parseInt("0xF"); //15
此外,用于执行Numeric类型转换的一个广泛使用的构造是Unary + Operator(第72页),它相当于将Number构造函数用作函数:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
如果你正在寻找性能,那么最好的结果可能是按位右移“10”>>0。也可以乘(“10”* 1)或not not(~~“10”)。它们都比Number和parseInt快得多。 他们甚至有“feature”为非数字参数返回0。 下面是性能测试。
获得结果的另一种方法是使用~操作符
在大多数情况下
~~someThing === parseInt(something)
但是~~对于parseInt接受的带尾字符的字符串或带基数规范的字符串(例如十六进制)将返回0,并且当parseInt返回NaN时也将返回0。另一个区别是~~如果给定一个bigint,则返回一个你可以添加另一个bigint的bigint,而parseInt如果bigint很大,则返回一个普通的浮点数(是的,它给出的值与parseFloat完全相同)
但是在大多数情况下~~比parseInt快30%。当浮点数表示为字符串时,它只会慢10%。
因此,如果~~的限制范围更适合你的需要,那么就节省使用电脑的时间,减少打字的时间