在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 section 15.7.1(作为函数调用的Number构造函数)中得知:当Number作为函数而不是构造函数被调用时,它执行类型转换...如果提供了value,则通过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)
时就是在指向该章节。
更新(请参见评论)
通过使用new
运算符调用Number
构造函数,您将获得Number
对象的实例,而不是数值字面量。例如:
typeof new Number(10); //object
typeof Number(10); //number
当
Number
作为new
表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。
valueOf
方法将被调用,但是与非对象的严格比较将失败。在我看来,胡乱操作Number
对象只是个坏主意(值得一提的是,Crockford也不喜欢它们)。 - Elias Van Ootegem如果你确定字符串中只包含数字,那么使用Number
的区别不大。但是如果有其他字符,Number
会返回NaN
。
另一个问题是,使用Number
构造函数时,同事可能会认为你忘记了new
关键字,并在后面添加它,导致严格比较失败new Number(123) === 123
--> false,而Number(123) === 123
--> true。
一般来说,我更喜欢将Number
构造函数保留为原样,只使用最短的语法来转换为整数/浮点数:+numString
,或使用parse*
。
Number("3 - 1")
将产生一个值为3的数字。 - Josh Diehlvar 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
请随意添加任何我可能遗漏的测试用例。
如果不使用 new
来创建一个数字值的包装对象,Number
只能从字符串转换成数字类型。
另一方面,正如你所提到的,parseFloat
可以从任何以数字、小数点或+/-开头的字符串中解析浮点数。
因此,如果您只使用包含纯数字值的字符串,则 Number(x)
和 parseFloat(x)
将产生相同的值。
" "
和""
的结果,两种情况下Number
函数都会给出0
,但parseFloat
会给出NaN
。 - gray state is comingparseFloat('1.2.3'); // 1.2
与Number('1.2.3'); // NaN
- Kip