哪个更好,数字(x)或parseFloat(x)?

时间:2012-09-01 12:12:32

标签: javascript optimization

哪个更好?

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

5 个答案:

答案 0 :(得分:249)

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 用作函数完全相同:

+

所以我通常只使用{{1}}。只要你知道它的作用,我就会发现它很容易阅读。

答案 1 :(得分:8)

不同之处在于当输入不是“正确数字”时会发生什么。 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

答案 2 :(得分:3)

在这些例子中,您可以看到差异:

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

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

parseFloat有点慢,因为它搜索字符串中数字的第一次出现,而Number constuctor则从包含空格或包含false值的数值的字符串创建新的数字实例。

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

据我所知,这只是同事们听到的,所以可能完全不知情,parseFloat的速度稍快。

虽然在进一步研究中,但这种性能差异似乎与浏览器有关。

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

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

正如@xdazz的回答所述,+""Number("")返回0parseFloat("")返回NaN所以我再次使用parseFloat,因为空字符串不表示数字0,只有字符为"0"的字符串表示0;