Javascript parseInt()和Number()之间有什么区别?
在将字符串转换为数字时,它们的行为如何不同?我总是使用parseInt,但要注意前导零会迫使它进入八进制模式 前两个将为您提供更好的性能,因为它返回的是原语而不是对象。它们在语义上不同,执行类型转换和解析,例如: 此外,Javascript parseInt()和Number()之间有什么区别?,javascript,performance,Javascript,Performance,在将字符串转换为数字时,它们的行为如何不同?我总是使用parseInt,但要注意前导零会迫使它进入八进制模式 前两个将为您提供更好的性能,因为它返回的是原语而不是对象。它们在语义上不同,执行类型转换和解析,例如: 此外,parseInt将忽略与当前使用的基数的任何数字不对应的尾随字符 Number构造函数不检测隐式八进制,但可以检测显式八进制表示法: Number("010"); // 10 Number("0o10") /
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
此外,一个广泛使用的用于执行数字类型转换的构造是,它相当于使用Number
构造函数作为函数:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
如果您正在寻找性能,那么按位右移
“10”>>0
可能会得到最好的结果。也可以乘法(“10”*1
)或不乘法(~“10”
)。它们都比Number
和parseInt
快得多。
他们甚至有“功能”返回0作为非数字参数。
以下是。我发现在将
字符串
转换为int
的几种方法中,有两个性能链接比较
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
parseInt(str,10)
解析浮点(str)
strparseInt转换为整数,也就是说,它去掉小数。数字不能转换为整数。一个微小的区别是它们转换为未定义的
或空
Number() Or Number(null) // returns 0
当
parseInt() Or parseInt(null) // returns NaN
parseInt()
->将数字解析为指定的redix
Number()
因此,要将一些非数值转换为数字,我们应该始终使用number()函数
例如
parseInt()
函数在进行redix转换时有各种各样的特殊情况,因此我们应该避免使用parseInt()函数进行协同转换
现在,要检查提供的值是否为数字,我们应该使用本机isNaN()
函数摘要:
parseInt()
:
- 将字符串作为第一个参数,将基数(一个整数,它是数字系统的基数,例如十进制10或二进制2)作为第二个参数
- 如果无法将第一个字符转换为数字,函数将返回整数
NaN
- 如果
parseInt()
函数遇到一个非数值,它将切断输入字符串的其余部分,只解析该部分,直到找到非数值为止
- 如果基数为
未定义
或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不是数字,它只计算0xF,因此记录15
log(parseInt('0xFz123',16));
//因为基数是10,所以A被认为是字母而不是数字(就像十六进制)
//因此,将切断管柱,并记录10
console.log(parseInt('10A',10));//10
//第一个字符不是数字,因此parseInt将返回NaN
log(parseInt('a213',10));
console.log('\n');
//以0X开头,所以数字将解释为十六进制值
console.log(编号('0x11'));
//无法转换为数字,将返回NaN,请注意
//数字构造函数不会像parseInt那样切断非数字部分
控制台日志(编号('123A');
//科学记数法是允许的
控制台日志(编号('152e-1');//15.21除非您需要十六进制或八进制,否则最好不要使用parseInt并使用Number和Math.round。两者都可以使用字符串。为什么要远离它
parseInt(0.001, 10)
0
parseInt(-0.0000000001, 10)
-1
parseInt(0.0000000001, 10)
1
parseInt(4000000000000000000000, 10)
4
它完全可以屠杀大量或少量的人。奇怪的是,如果这些输入是字符串,它就会正常工作
parseInt("-0.0000000001", 10)
0
parseInt("0.0000000001", 10)
0
parseInt("4000000000000000000000", 10)
4e+21
我不会冒着很难找到这个和其他gotchas人提到的bug的风险,我只会避免parseInt,除非您需要解析除base 10之外的东西。Number、Math.round、Math.foor和.toFixed(0)都可以做相同的事情,而parseInt可以用于这些类型的错误
如果您确实想要或需要使用parseInt作为它的一些其他特性,请不要使用它将浮点转换为int。因为没有提到过,当使用带有数字分隔符的数字和parseInt
时,它们的行为也不同:
const num1=5_0;//50
常数num2=数字(5_0);//50
常量num3=数字(“5_0”);//楠
常量num4=parseInt(5_0);//50
常量num5=parseInt(“5_0”);//5.
有趣的是,parseInt会忽略数字后面的任何字符吗?因为在我的情况下,转换时我宁愿得到一个NaN而不是20。是的。听起来你肯定想要数字()谢谢你。这是我第一次见到南。了解这一点可能对一些人有所帮助
Number("")//0
parseInt("")//NaN
Number("123")//123
parseInt("123")//123
Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string
Number(true)//1
parseInt(true) //NaN
parseInt(0.001, 10)
0
parseInt(-0.0000000001, 10)
-1
parseInt(0.0000000001, 10)
1
parseInt(4000000000000000000000, 10)
4
parseInt("-0.0000000001", 10)
0
parseInt("0.0000000001", 10)
0
parseInt("4000000000000000000000", 10)
4e+21