parseInt vs 단항 더하기, 언제 사용해야합니까?


149

이 줄의 차이점은 무엇입니까?

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)를 사용하는 것을 선호해야합니까 ???

편집 : 이중 물결표 연산자의 차이점은 무엇 ~~입니까?


답변:


169

보다 완벽한 사례 집합에 대해서는 이 답변 을 참조하십시오




글쎄, 여기에 내가 아는 몇 가지 차이점이 있습니다.

  • 빈 문자열 ""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
  • parseIntparseFloat분석하고 문자열 빌드 왼쪽에서 오른쪽을 . 유효하지 않은 문자가 표시되면 구문 분석 된 항목 (있는 경우)을 숫자로, 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.

6
기수를 사용할 때도+"0xf" != parseInt("0xf", 10)
Alex K.

나는 지금까지 당신의 대답을 좋아합니다. 또한 이중 물결표 연산자 ~~의 차이점이 무엇인지 설명 할 수 있습니까?
hereandnow78

@ hereandnow78 여기에 설명되어 있습니다 . 비트 단위는 Math.floor()기본적으로 소수 부분을 잘라냅니다.
Joseph

4
실제로 "2e3"는의 유효한 정수 표현이 아닙니다 2000. 그러나 유효한 부동 소수점 숫자 입니다. 정답으로 parseFloat("2e3")올바르게 산출 2000됩니다. 그리고 "0xf"적어도 16이 필요합니다. 그래서 parseInt("0xf", 10)returns 0는이지만 parseInt("0xf", 16)기대했던 15는 반환됩니다.
Bart

2
@Joseph the Dreamer와 @ hereandnow78 : 이중 물결표는 숫자의 소수 부분을 차단하고 Math.floor는 가장 가까운 숫자를 반환합니다. 양수에 대해서도 동일하게 작동하지만 Math.floor(-3.5) == -4~~-3.5 == -3.
Albin

261

최고의 숫자 변환 표 : 변환 표


2
"NaN"이 표에 추가 하십시오.
chharvey December

그것은 추가 가치가있을 수도 있습니다 isNaN이 테이블에 열을 예를 들어, isNaN("")(즉,이 숫자 간주) 거짓이지만, parseFloat("")이다 NaN당신이 사용하려는 경우 잡았다가 될 수있는, isNaN그것을 전달하기 전에 입력의 유효성을 검사parseFloat
Retsam

또한 '{valueOf: function(){return 42}, toString: function(){return "56"}}'목록에 추가해야 합니다. 혼합 된 결과는 흥미 롭습니다.
murrayju

3
그래서, 표의 요약 +은 단지 더 짧은 글쓰기 방법이며, 더 Number먼 것들은 가장자리에 실패하는 미친 방법일까요?
Mihail Malostanidis

[] .undef가 있습니까, 아니면 정의되지 않은 임의의 생성 방법입니까? Google을 통해 JS와 관련된 "undef"에 대한 기록을 찾을 수 없습니다.
jcairney

10

내가 생각하는 thg435의 답변에있는 표는 포괄적이지만 다음과 같은 패턴으로 요약 할 수 있습니다.

  • 단항 더하기는 모든 허위 값을 동일하게 취급하지는 않지만 모두 허위로 나옵니다.
  • 단항 플러스 전송 true1 만 "true"NaN.
  • 반면에 parseInt순수한 숫자가 아닌 문자열에 대해서는 더 자유 롭습니다. parseInt('123abc') === 123반면에 +보고합니다 NaN.
  • Number유효한 십진수를 허용하는 반면 parseInt소수를 지나서 모든 것을 삭제합니다. 따라서 parseIntC 동작을 모방하지만 사용자 입력을 평가하는 데 적합하지 않을 수 있습니다.
  • 둘 다 문자열에서 공백을 다듬습니다.
  • parseInt잘못 설계된 파서 인 8 진수 및 16 진수 입력을 허용합니다. 단항 플러스는 16 진법 만 사용합니다.

Falsy 값으로 변환 Number: C에서 의미가 될지 다음 nullfalse양쪽 모두 0이다. ""0으로 이동하면이 규칙을 따르지 않지만 충분히 이해됩니다.

따라서 사용자 입력의 유효성을 검사하는 경우 단항 더하기에는 소수점 이하 자릿수를 제외한 모든 항목에 대해 올바른 동작이 있다고 생각합니다 (그러나 실제 경우에는 userId 대신 이메일 입력을 잡는 데 더 관심이 있습니다. parseInt가 너무 자유 롭습니다.


2
"단항 더하기에는 16 진수 만 사용합니다"10 진수를 의미하지 않습니까?
krillgar

0

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));

-3

성능 도 고려하십시오 . parseIntiOS에서 단항 플러스 를 능가 한다고 놀랐습니다. : 이것은 CPU 소비가 많은 웹 앱에만 유용합니다. 일반적으로 JS opt-guys는 요즘 모바일 성능 관점에서 JS 운영자를 다른 운영자보다 고려할 것을 제안합니다.

따라서 모바일 우선 ;)


다른 게시물은 서로 다른 일을 설명하므로 서로 쉽게 교체 할 수 없습니다…
Bergi

@ Bergi, 맞습니다.하지만 공통점이 많습니다. 확실히 유일한 선택 인 JavaScript의 성능 솔루션을 하나만 알려주십시오. 일반적으로 이것이 바로 Rule-of-thumbs가 우리를 위해 존재하는 이유입니다. 나머지는 작업마다 다릅니다.
Arman McHitarian

3
@ArmanMcHitaryan 이것은 쓸모없는 미세 최적화이며 가치가 없습니다. 이 기사를 확인하십시오 -fabien.potencier.org/article/8/…
webvitaly

@webvitaly, 좋은 기사. "가장 빠른"코드를 작성하고 나쁘지 않은 특정 프로젝트에 항상 퍼포먼스 지향적 인 사람들이 있습니다. 이것이 제가 "JS opt-guys to 고려해야 할 것"이라고 언급 한 이유입니다. 이것은 물론 필수는 아닙니다 :), 그러나 나는 그것을 훨씬 더 읽기 쉽습니다.
Arman McHitarian

이에 대한 인용이 있습니까? 연결이 끊어졌습니다.
djechlin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.