JavaScript에서 문자열을 숫자로 변환하는 가장 빠른 방법은 무엇입니까?


122

모든 숫자, 숫자입니다. 문자열은 숫자처럼 보이며 숫자입니다. 그 밖의 모든 것은 NaN입니다.

'a' => NaN
'1' => 1
1 => 1

가장 빠른 것은 주어진 시간에 주어진 구현의 최적화에 달려 있습니다. 객관적으로 "가장 빠른"방법은 없습니다.
I Hate Lazy

2
'1a'문자열로 무엇을해야 합니까? 로 ' 1'하나? 즉,이를 수행하는 가장 일반적인 방법 ( Number(x)parseInt(x, 10))만으로는 충분하지 않은 이유 는 무엇입니까?
raina77ow


여기에 다른 방법의 좋은 성능 비교 : jsben.ch/#/NnBKM
EscapeNetscape

답변:


192

내가 아는 한 4 가지 방법이 있습니다.

Number(x);
parseInt(x, 10);
parseFloat(x);
+x;

제가 만든이 빠른 테스트를 통해 실제로 브라우저에 따라 다릅니다.

http://jsperf.com/best-of-string-to-number-conversion/2

Implicit 3 개의 브라우저에서 가장 빠르지 만 코드를 읽기 어렵게 만듭니다. 그러니 원하는대로 선택하세요!


7
흥미롭게도 Google Analytics (웹 사이트에 붙여 넣는 부분)는 위와 1*유사한 날짜-숫자 변환을 사용합니다 +. 즉 1*new Date()보다는 +new Date(). 아마도 더 읽기 쉬울까요?
Matthew Wilcoxson 2013

1
1*오류가 적기 때문에 선호 한다고 생각 합니다. 이전에 원하지 않는 매달린 변수 +1는 구문 분석 오류가 아닙니다. 에서 사용하는 것과 유사한 트릭 if (MYCONSTANT == myvar)입니다 C.
Tomas 2013

5
@beatak-현재 최적화는 암시 적 변환이 아닌 기본 방법을 선호하는 것 같습니다. Windows Server 2008 R2 / 7의 Chrome 37.0.2062.124와 Firefox 30.0의 ParseInt ()에서 Number ()가 가장 빨라지고 있습니다. 또한 일반적인 비교를 위해 테스트에 문자열 리터럴 부동 소수점을 포함하는 것을 고려할 수 있습니다. 내 생각 엔 문자열을 부동 소수점으로 변환하는 것이 일반적으로 문자열에서 정수로 변환하는 것보다 느리기 때문에 어떤 경우에는 순서를 변경할 수 있습니다. 현재 테스트 방식은 Number ()를 사용할 때 문자열을 int로 변환하는 것입니다.
Nolo 2014 년

1
크롬 61.0.3163. Number ()가 가장 빠릅니다.
드미트리 Petukhov

70

이를 수행하는 방법은 최소 5 가지입니다.

정수로만 변환하려는 경우 또 다른 빠른 (짧은) 방법은 이중 비트가 아닌 (즉, 두 개의 물결표 문자 사용)입니다.

예 :

~~x;

참조 : http://james.padolsey.com/cool-stuff/double-bitwise-not/

지금까지 내가 알고있는 5 가지 일반적인 방법으로 문자열을 숫자로 변환하는 방법은 모두 차이가 있습니다 (작동하는 비트 연산자가 더 많지만 모두 동일한 결과를 제공합니다 ~~). 이 JSFiddle은 디버그 콘솔에서 기대할 수있는 다양한 결과를 보여줍니다. http://jsfiddle.net/TrueBlueAussie/j7x0q0e3/22/

var values = ["123",
          undefined,
          "not a number",
          "123.45",
          "1234 error",
          "2147483648",
          "4999999999"
          ];

for (var i = 0; i < values.length; i++){
    var x = values[i];

    console.log(x);
    console.log(" Number(x) = " + Number(x));
    console.log(" parseInt(x, 10) = " + parseInt(x, 10));
    console.log(" parseFloat(x) = " + parseFloat(x));
    console.log(" +x = " + +x);
    console.log(" ~~x = " + ~~x);
}

디버그 콘솔 :

123
  Number(x) = 123
  parseInt(x, 10) = 123
  parseFloat(x) = 123
  +x = 123
  ~~x = 123
undefined
  Number(x) = NaN
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = NaN
  ~~x = 0
null
  Number(x) = 0
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = 0
  ~~x = 0
"not a number"
  Number(x) = NaN
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = NaN
  ~~x = 0
123.45
  Number(x) = 123.45
  parseInt(x, 10) = 123
  parseFloat(x) = 123.45
  +x = 123.45
  ~~x = 123
1234 error
  Number(x) = NaN
  parseInt(x, 10) = 1234
  parseFloat(x) = 1234
  +x = NaN
  ~~x = 0
2147483648
  Number(x) = 2147483648
  parseInt(x, 10) = 2147483648
  parseFloat(x) = 2147483648
  +x = 2147483648
  ~~x = -2147483648
4999999999
  Number(x) = 4999999999
  parseInt(x, 10) = 4999999999
  parseFloat(x) = 4999999999
  +x = 4999999999
  ~~x = 705032703

~~x버전 다른 사람들이 종종 초래 "더"경우에 다수의 결과 undefined만이 잘못된 입력 실패 (예를 들면 그것은 반환 0문자열이 숫자가 아닌 문자가 포함 된 경우 후를 유효한 숫자).

과다

참고 : 정수 오버플로 및 / 또는 비트 잘림은에서 발생할 수 ~~있지만 다른 변환에서는 발생할 수 없습니다. 이렇게 큰 값을 입력하는 것은 드문 일이지만이를 알고 있어야합니다. 훨씬 더 큰 값을 포함하도록 예제가 업데이트되었습니다.

일부 Perf 테스트에 따르면 표준 parseIntparseFloat기능이 실제로 가장 빠른 옵션이며, 아마도 브라우저에 의해 고도로 최적화되었지만 모든 옵션이 충분히 빠르기 때문에 모두 요구 사항에 따라 다릅니다 . http://jsperf.com/best-of-string-to -숫자 변환 / 37

이것은 모두 parseInt / parseFloat가 훨씬 더 느리게 보이기 때문에 성능 테스트가 어떻게 구성되어 있는지에 달려 있습니다.

내 이론은 :

  • 거짓말
  • 젠장 라인
  • 통계
  • JSPerf 결과 :)

3
2147483647보다 큰 숫자에 대해서는주의하십시오 . 예 : ~~4294967296returns 0.
조셉 고 씨

@JosephGoh : 기회가 생기면 결과를 확장하여 int 범위 오버플로를 포함합니다. 일반적으로 숫자가 그렇게 크면 매우 특별한 인터페이스가 있으므로 오버플로를 인식해야합니다. Cheers
Gone Coding

@JosephGoh : 흥미롭게도 Chrome에서는 0이 아니라 부호있는 최대 값을지나 음수를 얻습니다. 그런 다음 unsigned int max 값을 초과하면 추가 비트를 삭제하는 것처럼 보입니다. 예 : "4999999999"=> 705032703
Gone Coding

8

+연산자를 문자열 앞에 붙 입니다.

console.log(+'a') // NaN
console.log(+'1') // 1
console.log(+1) // 1

7

문자열을 정수로 변환하는 빠른 방법은 비트 단위 또는 다음과 같이 사용하는 것입니다.

x | 0

구현 방법에 따라 다르지만 이론적으로 +x는 먼저 x숫자로 캐스팅 한 다음 매우 효율적으로 수행 할 것이기 때문에 이론적으로는 상대적으로 빠릅니다 (최소한 ) .


예,하지만 저는이 기술이 큰 정수를 잘라낸다고 생각합니다. 참고로 Math.floor () 대신 사용할 수도 있지만 동일한 문제가 있습니다.

다음 은 첫 번째 답변의 메서드와 관련된 다양한 비트 연산자jsperf입니다 . 일부 브라우저가 이전 테스트의 유사한 코드를 기반으로 다음 테스트를 최적화한다는 것을 알았 기 때문에 순서를 무작위로 지정했습니다. 상위 답변자와 달리 암시 적 방법이 최악의 방법이라는 것을 알았습니다.
명왕성

4

다음은 간단한 방법입니다. var num = Number (str); 이 예에서 str 은 문자열을 포함하는 변수입니다. 테스트하고 작동 방식을 확인할 수 있습니다. Google 크롬 개발자 도구 , 콘솔 로 이동 하여 다음 코드를 붙여 넣습니다. 변환이 수행되는 방법을 더 잘 이해하려면 주석을 읽으십시오.

// Here Im creating my variable as a string
var str = "258";


// here im printing the string variable: str
console.log ( str );


// here Im using typeof , this tells me that the variable str is the type: string
console.log ("The variable str is type: " + typeof str);


// here is where the conversion happens
// Number will take the string in the parentesis and transform it to a variable num as type: number
var num = Number(str);
console.log ("The variable num is type: " + typeof num);

4

나는 그것이 num * 1간단하고 명확하며 정수와 수레에서 작동 한다는 것을 알았습니다 ...


3

이것은 아마도 그렇게 빠르지는 않지만 귀하의 숫자가 적어도 특정 값 (예 : 0) 또는 최대 특정 값인지 확인하는 추가 이점이 있습니다.

Math.max(input, 0);

최소값을 보장해야하는 경우 일반적으로

var number = Number(input);
if (number < 0) number = 0;

Math.max(..., 0) 두 개의 문장을 작성하지 않아도됩니다.


왜 사용하지 Math.abs(input)않습니까? 또한 문자열을 양수로 변환하고 몇 개의 추가 문자를 저장합니다.
Aaron Gillion

1
@AaronGillion : Math.max (-5, 0)는 0을 반환합니다. Math.abs (-5)는 5를 반환합니다. 더 의미있는 사용 사례에 따라 다릅니다.
Dan Dascalescu 2016

1
오, 웁스, 예, 제가 그 코멘트를 쓴 늦은 밤 동안 제 사용 사례는 많이 달랐습니다.
Aaron Gillion 2016

경우 input숫자로 변환 할 수 없습니다 당신은 얻을 것이다NaN
Domas 월

0

공식적으로 출시 한 측정 및 데이터 유형 변환 라이브러리 인 UnitOf 를 사용해 볼 수 있습니다 ! UnitOf는 매우 빠르고 크기가 작으며 오류나 null / undefined를 던지지 않고 모든 데이터 유형을 변환하는 데 효율적입니다. 변환에 실패하면 정의한 기본값 또는 UnitOf의 기본값이 반환됩니다.

//One liner examples
UnitOf.DataType("12.5").toFloat(); //12.5 of type Float is returned. 0 would be returned if conversion failed.
UnitOf.DataType("Not A Num").toInt(10); //10 of type Int is returned as the conversion failed.

//Or as a variable
var unit = UnitOf.DataType("12.5");
unit.toInt(5); //12.5 of type Float is returned. 5 would be returned if the conversion failed.
unit.toFloat(8); // 12 of type Int is returned. 8 would be returned if the conversion failed.

0

가장 빠른 방법은 -0을 사용하는 것입니다.

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