哪个更好?
我问这个问题只是为了节省一些字节,因为我可以使用+ x代替number(x)。parsefloat做得更好吗?
哪个更好?
我问这个问题只是为了节省一些字节,因为我可以使用+ x代替number(x)。parsefloat做得更好吗?
Answers:
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
所以我通常只是+
简短地使用。只要您知道它的功能,我就会觉得它很容易阅读。
Number()
视为“怪异”,我什至会认为它更符合预期,空白是一个空值,但它不是null / undefined => 0是一个不错的结果。大(+)仍然适合您展示:)
Number('Infinity') === Infinity
而parseInt('Infinity') === NaN
+
(一元加号),因为如果您忘记上一行的分号,则可能会计算一个加法表达式。
区别在于输入不是“正确的数字”时会发生什么。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
NaN != NaN
虽然
NaN != NaN
评估为TRUE -谢谢你的提示!
isNaN(NaN)
返回true
在这些示例中,您可以看到不同之处:
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"
是IS 0
;
+x
0
不仅返回空字符串,还返回任何仅空格字符串。例如:+" "
,+"\t\t\t"
,+"\n\n"
-所有的人给0
的结果
据我所知,这只是从同事那里听到的,因此可能完全不了解,parseFloat的速度稍快一些。
尽管经过进一步的研究,但这种性能差异似乎取决于浏览器。
http://jsperf.com/parseint-vs-parsefloat/6
看看这些jsPerf的结果,然后打电话给您。(它也包括+ x测试)
如@xdazz的答案中所述,+""
并在Number("")
返回0
时parseFloat("")
返回return ,NaN
所以我还是要使用parseFloat,因为空字符串并不意味着数字0,只有其中包含字符的字符串"0"
意味着0;
parseFloat()
仍然是赢家。