이 줄의 차이점은 무엇입니까?
var a = parseInt("1", 10); // a === 1
이 라인
var a = +"1"; // a === 1
이 jsperf 테스트 는 node.js에 대한 가정하에 단항 연산자가 현재 크롬 버전에서 훨씬 빠르다는 것을 보여줍니다.
숫자가 아닌 문자열을 변환하려고하면 둘 다 반환됩니다 NaN
.
var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN
그렇다면 parseInt
단항 플러스 (특히 node.js)를 사용하는 것을 선호해야합니까 ???
편집 : 이중 물결표 연산자의 차이점은 무엇 ~~
입니까?
답변
보다 완벽한 사례 집합에 대해서는 이 답변 을 참조하십시오
글쎄, 여기에 내가 아는 몇 가지 차이점이 있습니다.
-
빈 문자열
""
A를 평가0
하면서,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
-
바와 같이의 코멘트에서 볼 @ 알렉스 K. ,
parseInt
그리고parseFloat
문자로 해석됩니다. 이것은 16 진법과 지수 표기법이 실패x
하고e
숫자가 아닌 성분 (적어도 10 진법 이상)으로 취급됨을 의미합니다.단항
+
은 제대로 변환합니다.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
잘못 설계된 파서 인 8 진수 및 16 진수 입력을 허용합니다. 단항 플러스는 16 진법 만 사용합니다.
Falsy 값으로 변환 Number
: C에서 의미가 될지 다음 null
과 false
양쪽 모두 0이다. ""
0으로 이동하면이 규칙을 따르지 않지만 충분히 이해됩니다.
따라서 사용자 입력의 유효성을 검사하는 경우 단항 더하기에는 소수점 이하 자릿수를 제외한 모든 항목에 대해 올바른 동작이 있다고 생각합니다 (그러나 실제 경우에는 userId 대신 이메일 입력을 잡는 데 더 관심이 있습니다. parseInt가 너무 자유 롭습니다.
답변
parseInt가 Node.JS에서 + 단항 연산자보다 빠르다는 점에주의하십시오. + 또는 | 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 소비가 많은 웹 앱에만 유용합니다. 일반적으로 JS opt-guys는 요즘 모바일 성능 관점에서 JS 운영자를 다른 운영자보다 고려할 것을 제안합니다.
따라서 모바일 우선 😉