哪个更好,number(x) 还是 parseFloat(x)?

Posted

技术标签:

【中文标题】哪个更好,number(x) 还是 parseFloat(x)?【英文标题】:What is the difference between Unary Plus/Number(x) and parseFloat(x)? 【发布时间】:2012-08-26 23:52:17 【问题描述】:

哪个更好?

我问这个只是为了节省几个字节,因为我可以使用 +x 而不是 number(x)。 parsefloat 做得更好吗?

【问题讨论】:

单精度浮点数在 32 位系统中占用 4 个字节以及普通整数。我不知道 javascript 如何处理浮点数,但我想它几乎是一样的。 @Christian:Javascript 中的所有数字都是双精度浮点数。 如果不是编辑部分,我会为这个问题投赞成票 【参考方案1】:

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

所以我通常只使用+ 简称。只要你知道它的作用,我觉得它很容易阅读。

【讨论】:

我不会将Number()whitespace=>0 行为视为“奇怪”我什至会认为它更符合预期,空格是一个空值,但它不是null/undefined => 0 是一个不错的结果。无论如何,大 (+) 为你展示展示 :) @NathanWall:可能想提一下Number('Infinity') === InfinityparseInt('Infinity') === NaN 我不会为此使用+(一元加号),因为如果您忘记了前一行的分号,则可能会计算加法表达式。 对于它们表现相同的情况,我发现 parseFloat 慢 1% 到 15%,当字符串中的小数位数增加时变慢。在我的系统中运行 1M 时,parseFloat('1.501') 比 Number('1.501') 慢 5%,parseFloat('1.50137585467') 比 Number('1.50137585467') 慢 15%。所以,我选择 Number()。 @ChrisBrownie55 哇,好球。我不知道 parseFloat 可以做到这一点。我猜 Infinity 不是整数!【参考方案2】:

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

例如:

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

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

【讨论】:

请注意NaN != NaN虽然 @Wex 哦,您提到 NaN != NaN 的计算结果为 TRUE - 感谢您的提示! 使用 isNaN() 测试 NaN 值,isNaN(NaN) 返回true【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

我什至会说parseFloat() 具有正确的结果,因为空字符串不是数字0(阅读:NaN),而带有字符"0" 的字符串在它是0; +x 不仅为空字符串返回0,还为任何纯空格字符串返回。示例:+" "+"\t\t\t"+"\n\n" - 结果都是0【参考方案5】:

据我所知,这只是从同事那里听到的,所以可能完全不了解,parseFloat 稍微快一点。

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

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

看看这些 jsPerf 的结果,让你知道。 (它也包括 +x 测试)

正如@xdazz 的回答中所述,+""Number("") 返回 0parseFloat("") 返回 NaN 所以我再次选择 parseFloat,因为空字符串并不意味着数字 0,只有一个带有字符"0"的字符串表示0;

【讨论】:

这是more exhaustive test 寻找更快的转换方式...parseFloat() 仍然是赢家。

以上是关于哪个更好,number(x) 还是 parseFloat(x)?的主要内容,如果未能解决你的问题,请参考以下文章

哪个“for”循环具有更好的时间复杂度?

这些 SQL 查询是不是等效?哪个更好还是有更好的选择?

哪个最常用? RSS 还是 Atom?哪个更好?

PigServer 还是 PigRunner?哪个更好?

哪个 Silverlight Control Set 更好? Telerik 还是 ComponentArt? [关闭]

哪个更好:DataSet 还是 DataReader?