如何parseInt()
以及Number()
将字符串转换为数字时不同的表现?
parseInt() 和 Number() 有什么区别?
IT技术
javascript
performance
2021-01-28 03:15:04
6个回答
好吧,它们在语义上是不同的,作为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
此外,一个广泛使用的用于执行数值类型转换的构造是一元+
运算符 (p. 72),它相当于将Number
构造函数用作函数:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
前两个将为您提供更好的性能,因为它返回一个原语而不是一个对象。
如果您正在寻找性能,那么按位右移可能会获得最佳结果"10">>0
。也乘("10" * 1
)或不乘(~~"10"
)。所有这些都比Number
和快得多parseInt
。他们甚至有“功能”为非数字参数返回 0。这里是性能测试。
概括:
parseInt()
:
- 将字符串作为第一个参数,基数(作为数字系统基础的整数,例如十进制 10 或二进制 2)作为第二个参数
- 该函数返回一个整数,如果第一个字符不能转换为数字
NaN
将返回。 - 如果
parseInt()
函数遇到非数值,它会切断输入字符串的其余部分,只解析该部分,直到非数值。 - 如果基数为
undefined
或 0,JS 会假设如下:- 如果输入字符串以“0x”或“0X”开头,基数为16(十六进制),则将字符串的其余部分解析为数字。
- 如果输入值以 0 开头,则基数可以是 8(八进制)或 10(十进制)。选择哪个基数取决于 JS 引擎的实现。
ES5
指定应该使用 10。但是,并非所有浏览器都支持此功能,因此如果您的数字可以以 0 开头,请始终指定基数。 - 如果输入值以任何数字开头,则基数将为 10
Number()
:
- 该
Number()
构造可以任何参数输入转换成一个数字。如果Number()
构造函数无法将输入转换为数字,NaN
则返回。 - 该
Number()
构造还可以处理十六进制数,他们必须开始0x
。
例子:
console.log(parseInt('0xF', 16)); // 15
// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));
// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10)); // 10
// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));
console.log('\n');
// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));
// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));
// scientific notation is allowed
console.log(Number('152e-1')); // 15.21
我发现在几种转换string
为int
.
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)