这条线有什么区别:
var a = parseInt("1", 10); // a === 1
这条线
var a = +"1"; // a === 1
这个jsperf test显示了当前chrome版本中的一元运算符要快得多,假设它是针对node.js的!
如果我尝试转换不是数字的字符串,两个都返回NaN
:
var b = parseInt("test", 10); // b === NaN
var b = +"test"; // b === NaN
那么什么时候我应该更喜欢使用parseInt
而不是一元加号(特别是在node.js中)呢?
edit:和双波浪号操作符~~
有什么区别?
6条答案
按热度按时间gajydyqb1#
我建议使用Math.floor(或者~~,如果你知道数字是正数的话)代替parseString。+(表达式)超出了范围,因为+(表达式)更像parseFloat。
基准源代码:
azpvetkf2#
也考虑一下performance。我很惊讶
parseInt
在iOS上击败了unary plus:)这只对CPU消耗很大的Web应用程序有帮助。作为一个经验法则,我建议JS opt-guys从移动的性能的Angular 考虑任何JS运营商而不是另一个。所以,移动优先;)
cclgggtu3#
最终的任意到数字转换表:
yeotifhr4#
好吧,这里有几个我知道的区别:
""
的计算结果为0
,而parseInt
的计算结果为NaN
。因此,空字符串应该为NaN
。+
更像parseFloat
,因为它也接受小数。另一方面,
parseInt
在看到非数字字符时停止解析,例如预期作为小数点的句点.
。parseInt
和parseFloat
解析并构建字符串 left to right。如果发现无效字符,则返回解析为数字的内容(如果有),如果没有解析为数字的内容,则返回NaN
。另一方面,如果整个字符串不可转换为数字,则一元
+
将返回NaN
。parseInt
和parseFloat
将按字符解析,这意味着十六进制和指数表示法将失败,因为x
和e
被视为非数字部分(至少在以10为底的情况下)。一元的
+
可以正确地转换它们。ccrfmcuu5#
我相信thg435的回答中的表格是全面的,但是我们可以用以下模式来总结:
true
发送到1,但将"true"
发送到NaN
。parseInt
对于不是纯数字的字符串更自由。parseInt('123abc') === 123
,而+
报告NaN
。Number
将接受有效的十进制数,而parseInt
仅丢弃小数点后的所有数字,因此parseInt
模拟了C的行为,但可能不适合评估用户输入。parseInt
是一个设计糟糕的 * 解析器 *,接受八进制和十六进制输入。一元加只接受十六进制。错误值转换为
Number
,遵循C语言中有意义的内容:null
和false
都是0。""
变为0并不完全符合这个约定,但对我来说足够有意义。因此,我认为,如果您正在验证用户输入,一元加号除了接受小数外,对所有内容都有正确的行为(但在我的真实的情况中,我更感兴趣的是捕捉电子邮件输入,而不是userId、完全省略的值等),而parseInt则过于自由。
3duebb1j6#
注意,parseInt比Node.JS中的+一元运算符快,+或|0更快,它们仅对NaN元素更快。
看看这个: