Number(...)和parseFloat(...)之间有什么区别

时间:2012-08-16 13:44:15

标签: javascript string-conversion

先前已经问过{p> What is the difference between parseInt(string) and Number(string) in JavaScript

但答案主要集中在radix以及parseInt获取"123htg"等字符串并将其转换为123的能力。

我在这里问的是,当你传递实际数字字符串而根本没有基数时,Number(...)parseFloat(...)的回报之间是否有任何重大差异

5 个答案:

答案 0 :(得分:21)

内部运作并没有那么不同,正如@James Allardic已经回答的那样。但是有一点不同。使用parseFloat,以一个或多个数字字符开头(后缀为字母数字字符)的(修剪)字符串可以转换为数字,Number将不会成功。如:

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

在两次转换中,输入字符串都会被修剪:

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

答案 1 :(得分:17)

没有。两者都将导致调用内部ToNumber(string)函数。

ES5 section 15.7.1(作为函数调用的数字构造函数):

  

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

     

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

来自ES5 section 15.1.2.3(parseFloat(string)):

  

...   如果trimmedStringtrimmedString的任何前缀都不满足StrDecimalLiteral的语法(参见9.3.1)   ...

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


更新(见评论)

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

typeof new Number(10); //object
typeof Number(10); //number

这在section 15.7.2(数字构造函数)中定义:

  

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

答案 2 :(得分:2)

没有太大的区别,只要你确定你的字符串中只有数字。如果有,Number将返回NaN
使用Number构造函数可能会遇到的另一个问题是,同事可能会认为您忘记了new关键字,并在以后添加它,导致严格的比较失败{{1} } - > false而new Number(123) === 123 - >真。

一般情况下,我更喜欢保留Number(123) === 123构造函数,只需使用最短的语法将强制转换为int / float:Number ,或使用+numString

答案 3 :(得分:0)

当不使用new为数值创建包装器对象时,Number将被简化为从字符串到数字的类型转换。

另一方面,如你所提到的,

'parseFloat'可以解析任何以数字,小数或+/-

开头的字符串中的浮点数

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

答案 4 :(得分:-1)

请原谅我发布另一个答案,但我刚刚通过谷歌搜索来到这里,但没有找到我想要的所有细节。在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);
}

给出以下输出:

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

一些值得注意的要点:

  1. 如果在尝试转换为数字之前使用if(val)进行保护,那么parseFloat()将返回一个除空格外的数字。
  2. Number除了空格以外的非数字字符外,在所有情况下都会返回一个数字。
  3. 请随意添加我可能遗失的任何测试用例。