모든 숫자, 숫자입니다. 문자열은 숫자처럼 보이며 숫자입니다. 그 밖의 모든 것은 NaN입니다.
'a' => NaN
'1' => 1
1 => 1
'1a'문자열로 무엇을해야 합니까? 로 ' 1'하나? 즉,이를 수행하는 가장 일반적인 방법 ( Number(x)및 parseInt(x, 10))만으로는 충분하지 않은 이유 는 무엇입니까?
모든 숫자, 숫자입니다. 문자열은 숫자처럼 보이며 숫자입니다. 그 밖의 모든 것은 NaN입니다.
'a' => NaN
'1' => 1
1 => 1
'1a'문자열로 무엇을해야 합니까? 로 ' 1'하나? 즉,이를 수행하는 가장 일반적인 방법 ( Number(x)및 parseInt(x, 10))만으로는 충분하지 않은 이유 는 무엇입니까?
답변:
내가 아는 한 4 가지 방법이 있습니다.
Number(x);
parseInt(x, 10);
parseFloat(x);
+x;
제가 만든이 빠른 테스트를 통해 실제로 브라우저에 따라 다릅니다.
http://jsperf.com/best-of-string-to-number-conversion/2
Implicit 3 개의 브라우저에서 가장 빠르지 만 코드를 읽기 어렵게 만듭니다. 그러니 원하는대로 선택하세요!
1*유사한 날짜-숫자 변환을 사용합니다 +. 즉 1*new Date()보다는 +new Date(). 아마도 더 읽기 쉬울까요?
1*오류가 적기 때문에 선호 한다고 생각 합니다. 이전에 원하지 않는 매달린 변수 +1는 구문 분석 오류가 아닙니다. 에서 사용하는 것과 유사한 트릭 if (MYCONSTANT == myvar)입니다 C.
정수로만 변환하려는 경우 또 다른 빠른 (짧은) 방법은 이중 비트가 아닌 (즉, 두 개의 물결표 문자 사용)입니다.
예 :
~~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 테스트에 따르면 표준 parseInt및 parseFloat기능이 실제로 가장 빠른 옵션이며, 아마도 브라우저에 의해 고도로 최적화되었지만 모든 옵션이 충분히 빠르기 때문에 모두 요구 사항에 따라 다릅니다 . http://jsperf.com/best-of-string-to -숫자 변환 / 37
이것은 모두 parseInt / parseFloat가 훨씬 더 느리게 보이기 때문에 성능 테스트가 어떻게 구성되어 있는지에 달려 있습니다.
~~4294967296returns 0.
문자열을 정수로 변환하는 빠른 방법은 비트 단위 또는 다음과 같이 사용하는 것입니다.
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);
이것은 아마도 그렇게 빠르지는 않지만 귀하의 숫자가 적어도 특정 값 (예 : 0) 또는 최대 특정 값인지 확인하는 추가 이점이 있습니다.
Math.max(input, 0);
최소값을 보장해야하는 경우 일반적으로
var number = Number(input);
if (number < 0) number = 0;
Math.max(..., 0) 두 개의 문장을 작성하지 않아도됩니다.
Math.abs(input)않습니까? 또한 문자열을 양수로 변환하고 몇 개의 추가 문자를 저장합니다.
input숫자로 변환 할 수 없습니다 당신은 얻을 것이다NaN
공식적으로 출시 한 측정 및 데이터 유형 변환 라이브러리 인 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.