这行之间有什么区别:
var a = parseInt("1", 10); // a === 1
这条线
var a = +"1"; // a === 1
此jsperf测试表明,假设适用于node.js !,在当前的chrome版本中,一元运算符要快得多。
如果我尝试转换不是数字的字符串,则都返回NaN
:
var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN
所以我什么时候应该更喜欢使用parseInt
一元加号(尤其是在node.js中)???
编辑:和双波浪号运算符有~~
什么区别?
#请参阅此答案以获取更多完整案例
好吧,这是我知道的一些区别:
-
空字符串的
""
计算结果为a0
,而其parseInt
计算结果为NaN
。IMO,空白字符串应为NaN
。+'' === 0; //true isNaN(parseInt('',10)); //true
-
一元的
+
行为更像是parseFloat
因为它也接受小数。parseInt
另一方面,当看到非数字字符(例如要用作小数点的句点)时,它将停止解析.
。+'2.3' === 2.3; //true parseInt('2.3',10) === 2; //true
-
parseInt
并从左到右parseFloat
解析并构建字符串。如果他们看到一个无效字符,它将返回解析为数字的内容(如果有的话),以及没有解析为数字的内容。NaN
+
另一方面,NaN
如果整个字符串不可转换为数字,则一元将返回。parseInt('2a',10) === 2; //true parseFloat('2a') === 2; //true isNaN(+'2a'); //true
-
如@Alex K.的评论所示,
parseInt
并将parseFloat
按字符进行解析。这意味着十六进制和指数符号将失败,因为x
和e
将被视为非数字组件(至少在base10上)。一元
+
将正确地转换它们。parseInt('2e3',10) === 2; //true. This is supposed to be 2000 +'2e3' === 2000; //true. This one's correct. parseInt("0xf", 10) === 0; //true. This is supposed to be 15 +'0xf' === 15; //true. This one's correct.
我认为thg435的答案中的表是全面的,但是我们可以用以下模式进行总结:
- 一元加法不会将所有伪造的值都一样对待,但是它们全都是伪造。
- 一元加发送
true
至1,但发送"true"
至NaN
。 - 另一方面,
parseInt
对于不是纯数字的字符串,它更为自由。parseInt('123abc') === 123
,而+
报告NaN
。 Number
将接受有效的十进制数字,而parseInt
只删除小数点后的所有内容。因此parseInt
模仿C行为,但对于评估用户输入可能不是理想的。- 两者都修剪字符串中的空格。
parseInt
解析器设计不良,它接受八进制和十六进制输入。一元加号仅需十六进制。
伪造的值转换为Number
遵循C:的意义, null
并且false
均为零。 ""
设为0并不完全遵循这个约定,但对我来说足够有意义。
因此,我认为如果您要验证用户输入,则一元加除接受小数点外,其他所有内容都具有正确的行为(但在我的现实生活中,我对捕获电子邮件输入而不是userId,值完全省略等更感兴趣), parseInt太宽松了。
注意,在Node.JS中parseInt比+一元运算符要快,+或| 0更快,这是错误的,它们仅对于NaN元素才更快。
看一下这个:
var arg=process.argv[2];
rpt=20000;
mrc=1000;
a=[];
b=1024*1024*1024*1024;
for (var i=0;i<rpt;i++)
a[i]=Math.floor(Math.random()*b)+' ';
t0=Date.now();
if ((arg==1)||(arg===undefined))
for (var j=0;j<mrc;j++) for (var i=0;i<rpt;i++) {
c=a[i]-0;
}
t1=Date.now();
if ((arg==2)||(arg===undefined)) {
for (var j=0;j<mrc;j++) for (var i=0;i<rpt;i++) {
d=a[i]|0;
}
}
t2=Date.now();
if ((arg==3)||(arg===undefined)) {
for (var j=0;j<mrc;j++) for (var i=0;i<rpt;i++) {
e=parseInt(a[i]);
}
}
t3=Date.now();
if ((arg==3)||(arg===undefined)) {
for (var j=0;j<mrc;j++) for (var i=0;i<rpt;i++) {
f=+a[i];
}
}
t4=Date.now();
console.log(a[i-1],c,d,e,f);
console.log('Eseguiti: '+rpt*mrc+' cicli');
console.log('parseInt '+(t3-t2));
console.log('|0 '+(t2-t1));
console.log('-0 '+(t1-t0));
console.log('+ '+(t4-t3));
也要考虑性能。我感到惊讶的是,它parseInt
在iOS上胜过一进制:)这仅对CPU消耗大的Web应用程序有用。作为一种经验法则,我建议JS opt-guy从当今的移动性能角度考虑将JS运算符视为另一个运算符。
因此,请先移动版;)
文章标签:javascript , node.js
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!