一元加/数字(x)和parseFloat(x)之间的区别是什么?

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

我知道我可以使用+x(一元加)而不是Number(x)。这些和parseFloat之间有区别吗?

103823 次浏览

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

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

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

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

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

看一下这些jsPerf结果,并做出决定。(它还包括+x个测试)

正如@xdazz的回答中所指出的那样,+""Number("")返回0,而parseFloat("")返回NaN,所以我还是会用parseFloat,因为空字符串并不意味着数字0,只有字符"0"的字符串才意味着0;

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

在这些例子中,你可以看到区别:

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


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

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

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

所以我通常只使用+作为简称。只要你知道它是做什么的,我觉得它很容易读懂。