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

IT技术 javascript optimization
2021-01-28 20:38:04

哪个更好?

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

5个回答

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

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

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

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

例如:

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

isNaN(Number("32f")) === true
parseFloat("32f") === 32
请注意,NaN != NaN虽然
2021-03-23 20:38:04
@Wex 哦,你说NaN != NaN评估为TRUE - 谢谢你的提示!
2021-04-02 20:38:04
使用isNaN()测试 NaN 值,isNaN(NaN)返回true
2021-04-04 20:38:04

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

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

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

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

我什至会说parseFloat()具有正确的结果,因为空字符串不是数字0(读取:NaN),而其中包含字符的字符串"0"0
2021-03-30 20:38:04
+x0不仅返回空字符串,还返回任何仅包含空格的字符串。示例:+" ", +"\t\t\t", +"\n\n"- 所有这些都给出0了结果
2021-04-11 20:38:04

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

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

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

看看这些 jsPerf 结果,然后让你打电话。(它还包括 +x 测试)

正如@xdazz指出的回答,+""Number("")返回0parseFloat("")返回NaN所以我要再次去parseFloat,因为一个空字符串并不代表数字0,只用字符的字符串"0"中这意味着0;

这是一个更详尽的测试钓鱼以更快的转换方式......parseFloat()仍然是赢家。
2021-04-01 20:38:04