但答案主要集中在radix
以及parseInt
获取"123htg"
等字符串并将其转换为123
的能力。
我在这里问的是,当你传递实际数字字符串而根本没有基数时,Number(...)
和parseFloat(...)
的回报之间是否有任何重大差异
答案 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)):
... 如果
trimmedString
和trimmedString
的任何前缀都不满足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
一些值得注意的要点:
请随意添加我可能遗失的任何测试用例。