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);
}
一些值得注意的收获:
请随意添加我可能缺少的任何测试用例。您将得到一个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