192

我问这个只是为了节省几个字节。

我知道我可以使用+x(unary plus) 而不是Number(x). 那些 和 有区别parseFloat吗?

4

5 回答 5

400

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

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

于 2012-12-03T02:13:23.710 回答
16

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

例如:

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

isNaN(Number("32f")) === true
parseFloat("32f") === 32
于 2012-09-01T12:20:28.330 回答
8

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

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

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

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

于 2012-09-01T12:21:16.293 回答
2

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

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

于 2012-09-01T12:16:14.930 回答
2

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

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

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

看看这些 jsPerf 结果,然后就可以打电话了。(它也包括 +x 测试)

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

于 2012-09-01T12:17:20.450 回答