JavaScript 中的 parseInt(string) 和 Number(string) 有什么区别,之前有人问过。
但答案基本上集中在将radix
字符串parseInt
转换"123htg"
为123
.
我在这里要问的是,当你传递一个完全没有基数的实际数字字符串Number(...)
时,它的返回值和返回值之间是否有很大差异。parseFloat(...)
JavaScript 中的 parseInt(string) 和 Number(string) 有什么区别,之前有人问过。
但答案基本上集中在将radix
字符串parseInt
转换"123htg"
为123
.
我在这里要问的是,当你传递一个完全没有基数的实际数字字符串Number(...)
时,它的返回值和返回值之间是否有很大差异。parseFloat(...)
正如@James Allardic 已经回答的那样,内部运作并没有那么不同。不过还是有区别的。使用parseFloat
,以一个或多个数字字符后跟字母数字字符开头的(修剪后的)字符串可以转换为数字,Number
但不会成功。如:
parseFloat('3.23abc'); //=> 3.23
Number('3.23abc'); //=> NaN
顺便说一句,在这两种转换中,输入字符串都会被修剪:
parseFloat(' 3.23abc '); //=> 3.23
Number(' 3.23 '); //=> 3.23
不会。两者都会导致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
表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。
只要您确定字符串中只有数字,就没有太大的区别。如果有,Number
将返回NaN
。
使用构造函数可能会遇到的另一个问题Number
是,同事可能会认为您忘记了new
关键字,并在稍后添加它,导致严格比较失败new Number(123) === 123
--> false 而Number(123) === 123
--> true。
一般来说,我更喜欢保留Number
构造函数的本来面目,只使用最短的语法来强制转换为 int/float:+numString
或 use parse*
。
当不new
用于为数值创建包装对象时,Number
它被降级为简单地进行从字符串到数字的类型转换。
另一方面,正如您提到的,“parseFloat”可以从任何以数字、小数或 +/- 开头的字符串解析浮点数
因此,如果您只使用仅包含数值的字符串,Number(x)
并且parseFloat(x)
将产生相同的值
请原谅我发布另一个答案,但我只是通过谷歌搜索来到这里,并没有找到我想要的所有细节。在 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
一些值得注意的要点:
请随时添加我可能缺少的任何测试用例。