30

JavaScript 中的 parseInt(string) 和 Number(string) 有什么区别,之前有人问过。

但答案基本上集中在将radix字符串parseInt转换"123htg"123.

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

4

5 回答 5

36

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

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

顺便说一句,在这两种转换中,输入字符串都会被修剪:

parseFloat('  3.23abc '); //=> 3.23
Number('   3.23 '); //=> 3.23
于 2012-08-16T13:55:09.263 回答
26

不会。两者都会导致ToNumber(string)调用内部函数。

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

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

如果提供了 value,则返回一个 Number 值(不是 Number 对象)ToNumber(value),否则返回+0

ES5 第 15.1.2.3 节(parseFloat(字符串)):

... 如果既没有trimmedString也没有任何前缀trimmedString满足 a 的语法StrDecimalLiteral(见 9.3.1)......

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


更新(见评论)

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

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

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

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

于 2012-08-16T13:48:06.253 回答
0

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

一般来说,我更喜欢保留Number构造函数的本来面目,只使用最短的语法来强制转换为 int/float:+numString或 use parse*

于 2012-08-16T13:52:56.033 回答
-1

当不new用于为数值创建包装对象时,Number它被降级为简单地进行从字符串到数字的类型转换。

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

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

于 2012-08-16T13:51:17.753 回答
-2

请原谅我发布另一个答案,但我只是通过谷歌搜索来到这里,并没有找到我想要的所有细节。在 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 在所有情况下都返回一个数字,除了空格以外的非数字字符。

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

于 2015-03-24T19:27:08.500 回答