哪个更好?
我问这只是为了削减几个字节,因为我可以使用+ x而不是数字(x)。 parsefloat会做得更好吗?
答案 0 :(得分:249)
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("")
返回0
而parseFloat("")
返回NaN
所以我再次使用parseFloat,因为空字符串不表示数字0,只有字符为"0"
的字符串表示0;