Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript parseInt()和Number()之间有什么区别?_Javascript_Performance - Fatal编程技术网

Javascript parseInt()和Number()之间有什么区别?

Javascript parseInt()和Number()之间有什么区别?,javascript,performance,Javascript,Performance,在将字符串转换为数字时,它们的行为如何不同?我总是使用parseInt,但要注意前导零会迫使它进入八进制模式 前两个将为您提供更好的性能,因为它返回的是原语而不是对象。它们在语义上不同,执行类型转换和解析,例如: 此外,parseInt将忽略与当前使用的基数的任何数字不对应的尾随字符 Number构造函数不检测隐式八进制,但可以检测显式八进制表示法: Number("010"); // 10 Number("0o10") /

在将字符串转换为数字时,它们的行为如何不同?

我总是使用parseInt,但要注意前导零会迫使它进入八进制模式

前两个将为您提供更好的性能,因为它返回的是原语而不是对象。

它们在语义上不同,执行类型转换和解析,例如:

此外,
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