parseInt ()와 Number ()의 차이점은 무엇입니까?


답변:


457

글쎄, 그들은는 의미 다른Number함수로 호출 생성자 를 수행 형식 변환parseInt수행이 구문 분석 예 :

// parsing:
parseInt("20px");       // 20
parseInt("10100", 2);   // 20
parseInt("2e1");        // 2

// type conversion
Number("20px");       // NaN
Number("2e1");        // 20, exponential notation

경우에 있다는 사실을 숙지 parseInt그것의 (검출이 문자열에 앞에 0, 8 진수 자료의 수를 구문 분석,이 ECMAScript를 5, 표준 새 버전에서 변경되었습니다,하지만 브라우저 구현에 도착하는 데 시간이 오래 걸릴 ECMAScript 3과의 비 호환성parseInt 인해 현재 사용중인베이스의 숫자와 일치하지 않는 후행 문자는 무시합니다.

Number생성자는 8 진수를 감지하지 않습니다

Number("010");         // 10
parseInt("010");       // 8, implicit octal
parseInt("010", 10);   // 10, decimal radix used

그러나 다음과 같이 16 진수 표기법으로 숫자를 처리 할 수 ​​있습니다 parseInt.

Number("0xF");   // 15
parseInt("0xF"); //15

또한 숫자 형식 변환을 수행하는 데 널리 사용되는 구문은 단항 +연산자 (p. 72) 이며 Number생성자를 함수로 사용하는 것과 같습니다 .

+"2e1";   // 20
+"0xF";   // 15
+"010";   // 10

흥미롭게도 parseInt는 숫자 뒤에 나오는 문자를 무시합니까? 내 경우에는 변환 할 때 20 대신 NaN을 얻는 것을 선호하기 때문입니다.
Mark

그렇습니다. 당신 같은 소리는 확실히 번호 () 원하는
가레스

좋아, 그래서 Number ()로 갈 것 같지만이 요점과 모든 예제를 해결해 주셔서 감사합니다! :-)
Mark

1
감사합니다. NaN을 본 것은 이번이 처음입니다. 일부 사람들은 NaN이 isNaN (value) 함수로 테스트되었다는 것을 아는 것이 도움이 될 수 있습니다. 예를 들어 "if (value == NaN)"을 사용하면 작동하지 않습니다.
WonderfulDay

1
Number()16 진 및 2 진과 같은 8 진법을 처리합니다.Number('0o10') == 8
Juan Mendes

22
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)

처음 두 개는 객체 대신 기본 요소를 반환하므로 성능이 향상됩니다.


20
new Number()와 다릅니다 Number(). typeof Number("123") => number
Gareth

8
또한 new Number("1") != new Number("1"). 절대 사용하지 마십시오new Number . 절대 절대 절대 절대 Number("1")반면에 완벽하게 합리적입니다.
Kragen Javier Sitaker

18
@Kragen, "새 번호"를 사용하지 말아야하는 이유를 설명하면 커뮤니티에 훨씬 도움이됩니다. "never"를 5 번 입력하는 대신 ...
ken

1
@ken 아주 오래된 의견이지만 미래의 방문객들에게는 그들이 처음부터 언급 한 이유 때문에 그것을 상상합니다. 두 숫자를 구문 분석 let x = new Number("2"); let y = new Number("2");한 다음 if (x == y) { doSomething(); }논리적으로 doSomething호출 해야하는 이유에 관계없이 평등 검사를 수행합니다 . 그러나 그렇지 않습니다. 당신은 단지 하나의 번호를 구문 분석 할 수 있다면 또한 let x = new Number("2");다음 x === 2잘못된 것입니다. 이것이 당신이 사용하지 말아야 할 분명한 이유입니다new Number
Tom C

1
@TomC 편집 된 주석의 결과를보고 있습니다 (주석 다음에있는 연필 아이콘이 나타납니다). 이전에는 설명이 없었으며 강력한 훈계가있었습니다.
ken

15

성능을 찾고 있다면 아마도 최상의 결과를 얻을 수있을 것 "10">>0입니다. 또한 곱하기 ( "10" * 1) 또는 안함 ( ~~"10"). 그들 모두는 훨씬 빠르게의입니다 NumberparseInt. 숫자 인수가 아닌 경우 "feature"가 0을 반환합니다. 성능 테스트 는 다음과 같습니다 .


1
다양한 접근 방식의 속도는 시간이 지남에 따라 브라우저 개정판에 따라 변경되는 것으로 보입니다. 또한 링크 된 테스트가 변경되었습니다, 그리고이 댓글의 같은 최신 버전은 여기 - jsperf.com/number-vs-parseint-vs-plus/39 - 다행히 사이트뿐만 아니라 시험의 이전 버전을 포함
보보

@bobo, 확실합니다. - 호기심 크롬으로 확인 Number하고 parseInt나머지에 비해 여전히 느린 99 %. 게다가 그들은 시각적으로도 매력적이지 않습니다 :-)
Saulius

15
"쓸모없는"최적화보다 항상 코드 명확성을 선호합니다. 대부분의 경우 parseInt또는 Number더 바람직합니다. 초당 수백만 번의 변환으로 N64 에뮬레이터를 프로그래밍하는 경우 이러한 트릭을 고려할 수 있습니다.
ngryman

1
문제는 행동에 관한 것이며, 성과에 대한 논의는 주제를 벗어난 것입니다.
공압

1
JavaScript에서는 비트 연산자가 피연산자를 10 진수가 아닌 32 비트 시퀀스로 취급하기 때문에 큰 정수 (특히 부호있는 32 비트 정수에 맞지 않는 정수)에는 사용할 수 없습니다. 16 진수 또는 8 진수 따라서 (2**31).toString() >> 0오버플로됩니다 -2147483648. 당신이 사용할 수있는 >>>대신에 >>자바 스크립트 대접에게로 피연산자 가지고 부호없는 32 비트 정수를하지만,보다 큰 다음 어떤 번호 2**32 - 1것 또한 오버 플로우.
hasc


6

하나 개의 작은 차이가의 변환 무엇 undefined이나 null,

Number() Or Number(null) // returns 0

동안

parseInt() Or parseInt(null) // returns NaN

6

요약:

parseInt():

  • 문자열을 첫 번째 인수로, 기수 (숫자 시스템의 기초 인 정수 (예 : 10 진수 10 또는 이진 2))를 두 번째 인수로 사용합니다.
  • 첫 문자를 숫자로 변환 할 수없는 경우이 함수는 정수를 반환합니다. NaN 반환됩니다.
  • 만약 parseInt() 함수는 숫자 이외의 값을 발견, 그것은 입력 문자열의 나머지 부분을 잘라 만이 아닌 수치까지 부분을 구문 분석합니다.
  • 기수가 undefined0이면 JS는 다음을 가정합니다.
    • 입력 문자열이 "0x"또는 "0X"로 시작하면 기수가 16 (16 진수)이고 나머지 문자열은 숫자로 구문 분석됩니다.
    • 입력 값이 0으로 시작하면 기수는 8 (8 진수) 또는 10 (10 진수)입니다. 선택되는 기수는 JS 엔진 구현에 따라 다릅니다. ES5그런 다음 10을 사용해야한다고 지정합니다. 그러나 모든 브라우저에서 지원되는 것은 아니므로 숫자가 0으로 시작할 수 있으면 항상 기수를 지정하십시오.
    • 입력 값이 임의의 숫자로 시작하면 기수가 10이됩니다.

Number():

  • Number()생성자는 숫자에 어떤 인수 입력을 변환 할 수 있습니다. Number()생성자가 입력을 숫자로 변환 할 수없는 경우 NaN반환됩니다.
  • 또한 Number()생성자는 16 진수를 처리 할 수 ​​있으며로 시작해야 0x합니다.

예:

console.log(parseInt('0xF', 16));  // 15

// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));

// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10));  // 10

// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));


console.log('\n');


// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));

// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));

// scientific notation is allowed
console.log(Number('152e-1'));  // 15.21


5

나는 항상 parseInt를 사용하지만 8 진 모드 로 강제하는 선행 0을 조심하십시오 .


35
parseInt(value, radix)실수로 8 진 모드 변환 을하지 않는 방식으로 기수를 공급하는 것이 항상 좋은 생각이라고 생각합니다 .
awesomo

선행 0 ECMAScript 3에서 8 진 모드로 강제 설정합니다. ECMAScript 5는 0엄격하지 않은 모드 에서도을 구문 분석 합니다. 그러나이 문제가 해결되었습니다 이제 선행 0은 너무 무시됩니다 parseInt("070")될 것입니다 70.
Piotrek Hryciuk 10

2
기수 값을로 제공하도록 경고하는 린터도 사용해야합니다 parseInt().
Justin

2

parseInt() -> 지정된 redix로 숫자를 구문 분석합니다.

Number()-> 지정된 값을 숫자로 변환하거나, 그렇지 않으면 NaN으로 변환합니다.

따라서 숫자가 아닌 값을 숫자로 변환하려면 항상 Number () 함수를 사용해야합니다.

예.

Number("")//0
parseInt("")//NaN

Number("123")//123
parseInt("123")//123

Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string

Number(true)//1
parseInt(true) //NaN

parseInt()redix 변환 을 수행 할 때 함수에 대한 다양한 코너 케이스가 있으므로, 강제 목적으로 parseInt () 함수를 사용하지 않아야합니다.

이제 날씨를 확인하기 위해 제공된 값이 숫자인지 여부는 기본 isNaN()기능을 사용해야 합니다


1

parseInt는 정수로 변환됩니다. 즉, 소수를 제거합니다. 숫자는 정수로 변환되지 않습니다.


1

16 진수 나 8 진수가 필요하지 않으면 parseInt에서 멀리 떨어져 Number와 Math.round를 사용하는 것이 좋습니다. 둘 다 문자열을 사용할 수 있습니다. 왜 멀리 떨어져 있습니까?

parseInt(0.001, 10)
0

parseInt(-0.0000000001, 10)
-1

parseInt(0.0000000001, 10)
1

parseInt(4000000000000000000000, 10)
4

완전 정육점은 정말로 크거나 작은 숫자입니다. 이상하게도 이러한 입력이 문자열이면 정상적으로 작동합니다.

parseInt("-0.0000000001", 10)
0

parseInt("0.0000000001", 10)
0

parseInt("4000000000000000000000", 10)
4e+21

이것과 다른 사람들이 언급 한 버그를 찾기가 어려워지는 대신, 기본 10 이외의 것을 구문 분석하지 않으면 parseInt를 피할 수 있습니다. Number, Math.round, Math.foor 및 .toFixed (0) 모두 가능 이러한 유형의 버그없이 parseInt를 사용할 수있는 것과 동일한 작업을 수행합니다.

다른 특성 중 일부에 대해 parseInt를 실제로 사용하거나 필요로하는 경우 float을 int로 변환하는 데 사용하지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.