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

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

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



답변

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

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

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

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

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


답변

이를 수행하는 방법은 최소 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 결과 🙂

답변

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

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


답변

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

x | 0

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


답변

다음은 간단한 방법입니다. 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);


답변

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


답변

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

Math.max(input, 0);

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

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

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