어떻게 parseInt()
와 Number()
숫자로 문자열을 변환 할 때 다르게 행동?
어떻게 parseInt()
와 Number()
숫자로 문자열을 변환 할 때 다르게 행동?
답변:
글쎄, 그들은는 의미 다른 의 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
Number()
16 진 및 2 진과 같은 8 진법을 처리합니다.Number('0o10') == 8
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
처음 두 개는 객체 대신 기본 요소를 반환하므로 성능이 향상됩니다.
new Number()
와 다릅니다 Number()
. typeof Number("123") => number
new Number("1") != new Number("1")
. 절대 사용하지 마십시오new Number
. 절대 절대 절대 절대 Number("1")
반면에 완벽하게 합리적입니다.
let x = new Number("2"); let y = new Number("2");
한 다음 if (x == y) { doSomething(); }
논리적으로 doSomething
호출 해야하는 이유에 관계없이 평등 검사를 수행합니다 . 그러나 그렇지 않습니다. 당신은 단지 하나의 번호를 구문 분석 할 수 있다면 또한 let x = new Number("2");
다음 x === 2
잘못된 것입니다. 이것이 당신이 사용하지 말아야 할 분명한 이유입니다new Number
성능을 찾고 있다면 아마도 최상의 결과를 얻을 수있을 것 "10">>0
입니다. 또한 곱하기 ( "10" * 1
) 또는 안함 ( ~~"10"
). 그들 모두는 훨씬 빠르게의입니다 Number
및 parseInt
. 숫자 인수가 아닌 경우 "feature"가 0을 반환합니다. 성능 테스트 는 다음과 같습니다 .
Number
하고 parseInt
나머지에 비해 여전히 느린 99 %. 게다가 그들은 시각적으로도 매력적이지 않습니다 :-)
parseInt
또는 Number
더 바람직합니다. 초당 수백만 번의 변환으로 N64 에뮬레이터를 프로그래밍하는 경우 이러한 트릭을 고려할 수 있습니다.
(2**31).toString() >> 0
오버플로됩니다 -2147483648
. 당신이 사용할 수있는 >>>
대신에 >>
자바 스크립트 대접에게로 피연산자 가지고 부호없는 32 비트 정수를하지만,보다 큰 다음 어떤 번호 2**32 - 1
것 또한 오버 플로우.
로 변환 string
하는 여러 가지 방법 중 두 가지 성능 링크가 비교 되었습니다 int
.
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
parseInt()
:
NaN
반환됩니다.parseInt()
함수는 숫자 이외의 값을 발견, 그것은 입력 문자열의 나머지 부분을 잘라 만이 아닌 수치까지 부분을 구문 분석합니다.undefined
0이면 JS는 다음을 가정합니다.
ES5
그런 다음 10을 사용해야한다고 지정합니다. 그러나 모든 브라우저에서 지원되는 것은 아니므로 숫자가 0으로 시작할 수 있으면 항상 기수를 지정하십시오.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
나는 항상 parseInt를 사용하지만 8 진 모드 로 강제하는 선행 0을 조심하십시오 .
parseInt(value, radix)
실수로 8 진 모드 변환 을하지 않는 방식으로 기수를 공급하는 것이 항상 좋은 생각이라고 생각합니다 .
0
엄격하지 않은 모드 에서도을 구문 분석 합니다. 그러나이 문제가 해결되었습니다 이제 선행 0은 너무 무시됩니다 parseInt("070")
될 것입니다 70
.
parseInt()
.
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()
기능을 사용해야 합니다
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로 변환하는 데 사용하지 마십시오.