number(x)或parseFloat(x)哪个更好?


146

哪个更好?

我问这个问题只是为了节省一些字节,因为我可以使用+ x代替number(x)。parsefloat做得更好吗?


2
在32位系统中,单精度浮点数和普通整数都占用4个字节。我不知道javascript如何处理浮点数,但我想它几乎是一样的。
基督教徒

5
@Christian:Javascript中的所有数字都是双精度浮点数。
Guffa 2012年

1
如果不是EDIT段,我会对此问题投赞成票
LaPuyaLoca

Answers:


309

parseFloat和Number之间的区别

parseFloat/ parseInt用于解析字符串,而Number/ +用于将值强制转换为数字。他们的行为有所不同。但是首先让我们看看它们的行为相同:

parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000

因此,只要您有标准的数字输入,就没有区别。但是,如果您的输入以数字开头,然后包含其他字符,parseFloat则在字符串中Number给出数字NaN(而不是数字)时会从字符串中截断数字:

parseFloat('1x'); // => 1
Number('1x'); // => NaN

此外,Number不了解十六进制输入parseFloat

parseFloat('0x10'); // => 0
Number('0x10'); // => 16

但是Number对于空字符串或仅包含空格的字符串却很奇怪:

parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0

总的来说,我发现Number这是更合理的,所以我几乎总是Number亲自使用(而且您会发现很多内部JavaScript函数也使用Number)。如果有人'1x'输入,我宁愿显示错误,也不愿像输入错误一样对待'1'。我唯一真正例外的情况是将样式转换为数字时,这种情况parseFloat很有用,因为样式以形式出现'3px',在这种情况下,我想删除'px'零件并得到3,所以我发现parseFloat有帮助这里。但是,实际上,您选择哪种取决于您,并且希望接受哪种输入形式。

请注意,使用一元运算+符与作为Number函数使用完全相同:

Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40

所以我通常只是+简短地使用。只要您知道它的功能,我就会觉得它很容易阅读。


2
我不会将空白=> 0的行为Number()视为“怪异”,我什至会认为它更符合预期,空白是一个空值,但它不是null / undefined => 0是一个不错的结果。大(+)仍然适合您展示:)
jave.web 2014年

4
@NathanWall:可能想提一下,Number('Infinity') === InfinityparseInt('Infinity') === NaN
sstur

3
我不会为此使用+(一元加号),因为如果您忘记上一行的分号,则可能会计算一个加法表达式。
杰克逊

1
对于这些情况,它们的行为相同,我发现parseFloat的速度从1%降低到15%,当字符串中的小数位数增加时,速度也会变慢。在我的系统中运行1M时,parseFloat('1.501')比Number('1.501')慢5%,而parseFloat('1.50137585467')比Number('1.50137585467')慢15%。因此,我选择了Number()。
bytepan

1
@ ChrisBrownie55哇,好抓。我不知道parseFloat可以做到这一点。我想Infinity不是整数!
sstur

9

区别在于输入不是“正确的数字”时会发生什么。Number返回,NaN同时parseFloat“尽可能多地”解析。如果对空字符串调用,则Number返回,0而parseFloat返回NaN

例如:

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32

4
请注意,NaN != NaN虽然
Wex

@Wex哦,你彪认为NaN != NaN评估为TRUE -谢谢你的提示!
jave.web 2014年

4
使用isNaN()测试NaN值,isNaN(NaN)返回true
jave.web 2014年

5

在这些示例中,您可以看到不同之处:

Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;

parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;

parseFloat会慢一些,因为它会搜索字符串中数字的首次出现,而Number构造函数会从包含带空格的数字值或包含假值的字符串中创建一个新的数字实例。

PS:如果您对某些通用类型转换解决方案感兴趣,可以在我的博客中阅读有关类型转换的文章:http//justsimplejs.blogspot.com/2012/08/data-type-conversion.html


2

对于空字符串,它们是不同的。

+""Number("")返回0,而parseFloat("")返回NaN。


2
我要说的是,parseFloat()具有正确结果的是,空字符串不是数字0(读取:NaN),而其中包含字符的字符串"0"是IS 0
克里斯托弗·

+x0不仅返回空字符串,还返回任何仅空格字符串。例如:+" "+"\t\t\t"+"\n\n"-所有的人给0的结果
卢卡斯Wiktor的

2

据我所知,这只是从同事那里听到的,因此可能完全不了解,parseFloat的速度稍快一些。

尽管经过进一步的研究,但这种性能差异似乎取决于浏览器。

http://jsperf.com/parseint-vs-parsefloat/6

看看这些jsPerf的结果,然后打电话给您。(它也包括+ x测试)

如@xdazz的答案中所述,+""并在Number("")返回0parseFloat("")返回return ,NaN所以我还是要使用parseFloat,因为空字符串并不意味着数字0,只有其中包含字符的字符串"0"意味着0;


这是更详尽的测试钓鱼,它可以更快地转换... parseFloat()仍然是赢家。
mindplay.dk 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.