Javascript Number(…)和parseFloat(…)之间的区别是什么

Javascript Number(…)和parseFloat(…)之间的区别是什么,javascript,string-conversion,Javascript,String Conversion,以前曾被问过 但答案基本上集中在基数和parseInt获取类似的字符串“123htg”并将其转换为123的能力上 这里我要问的是,当传递一个没有基数的实际数字字符串时,Number(…)和parseFloat(…)的返回值之间是否有很大的差异。否。两者都会导致调用内部函数 From(作为函数调用的数字构造函数): 当Number作为函数而不是构造函数调用时,它将执行类型转换 返回由ToNumber(value)计算的数字值(不是数字对象),如果提供了值,则返回+0 From(parseFloat

以前曾被问过

但答案基本上集中在
基数
parseInt
获取类似
的字符串“123htg”
并将其转换为
123
的能力上


这里我要问的是,当传递一个没有基数的实际数字字符串时,
Number(…)
parseFloat(…)
的返回值之间是否有很大的差异。

否。两者都会导致调用内部函数

From(作为函数调用的数字构造函数):

Number
作为函数而不是构造函数调用时,它将执行类型转换

返回由
ToNumber(value)
计算的数字值(不是数字对象),如果提供了值,则返回
+0

From(parseFloat(string)):

。。。 如果
trimmedString
trimmedString
的任何前缀都不符合
StrDecimalLiteral
的语法(见9.3.1)

并且是标题为“应用于字符串类型的ToNumber”的部分,这是第一个引号在表示
ToNumber(value)
时所指的部分


更新(见评论)

通过使用
new
操作符调用
Number
构造函数,您将获得
Number
对象的实例,而不是数值文本。例如:

typeof new Number(10); //object
typeof Number(10); //number
这在(数字构造函数)中定义:

Number
作为
new
表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象


当不使用
new
为数值创建包装器对象时,
Number
被降级为只执行从字符串到数字的类型转换

另一方面,正如您所提到的,parseFloat可以从任何以数字、小数或数字开头的字符串中解析浮点数+/-


因此,如果您只处理只包含数值的字符串,
Number(x)
parseFloat(x)
将产生相同的值

没有太大差异,只要您确定字符串中只有数字。如果存在,
Number
将返回
NaN

使用
Number
构造函数可能会遇到的另一个问题是,同事可能会认为您忘记了
new
关键字,然后再添加它,导致严格比较失败
newnumber(123)==123
-->false,而
Number(123)==123
-->true


一般来说,我更喜欢保留
数字
构造函数,只需使用最短的语法将其转换为int/float:
+numString
,或者使用
parse*

内部工作没有那么大的不同,正如@James Allardic已经回答的那样。但这是有区别的。使用
parseFloat
,以一个或多个数字字符开头,后跟字母数字字符的(修剪过的)字符串可以转换为数字,而
Number
则不会成功。例如:

parseFloat('3.23abc'); //=> 3.23
Number('3.23abc'); //=> NaN
在这两种转换中,输入字符串都会被修剪,顺便说一下:

parseFloat('  3.23abc '); //=> 3.23
Number('   3.23 '); //=> 3.23

请原谅我发布了另一个答案,但我只是通过谷歌搜索到这里,并没有找到我想要的所有细节。在Node.js中运行以下代码:

var vals = ["1", "1.1", "0", "1.1abc", "", " ", null];
for(var i = 0; i < vals.length; i++){
  var ifTest = false;
  if(vals[i])
  {
    ifTest = true;
  }
  console.log("val=" + vals[i] + ", Number()=" + Number(vals[i])+ ", parseFloat()=" + parseFloat(vals[i]) + ", if()=" + ifTest);
}
一些值得注意的收获:

  • 如果在尝试转换为数字之前使用If(val)进行保护,则parseFloat()将返回一个数字,空格大小写除外
  • Number返回除空格以外的非数字字符以外的所有情况下的数字

  • 请随意添加我可能缺少的任何测试用例。

    您将得到一个Number对象,在非严格比较中,它的
    valueOf
    方法将被调用,但与非对象的严格比较将失败。在IMO中乱搞
    Number
    对象是一个坏主意(不管怎样,Crockford也不喜欢它们)+1,这是真的,但在问题中定义的情况下,没有区别——“当你传递一个实际的数字字符串时”。假设我已经正确理解了这一点。另一个区别是
    的结果,在这两种情况下,Number都给出
    0
    ,而parseFloat给出
    NaN
    。我知道这一点。我甚至在评论中说。。。这不是我要问的……事实并非如此<代码>数字(“3-1”)将生成一个值为3的数字。
    val=1, Number()=1, parseFloat()=1, if()=true
    val=1.1, Number()=1.1, parseFloat()=1.1, if()=true
    val=0, Number()=0, parseFloat()=0, if()=true
    val=1.1abc, Number()=NaN, parseFloat()=1.1, if()=true
    val=, Number()=0, parseFloat()=NaN, if()=false
    val= , Number()=0, parseFloat()=NaN, if()=true
    val=null, Number()=0, parseFloat()=NaN, if()=false