number (x) 또는 parseFloat (x) 중 어느 것이 더 낫습니까?


146

어떤게 더 좋아?

나는 number (x) 대신 + x를 사용할 수 있기 때문에 몇 바이트를 면도하기 위해 이것을 요구하고 있습니다. parsefloat가 더 잘 작동합니까?


2
단정도 부동 소수점 숫자는 일반 정수뿐만 아니라 32 비트 시스템에서 4 바이트를 차지합니다. 자바 스크립트가 플로트를 처리하는 방법을 모르겠지만 거의 동일하다고 생각합니다.
Christian

5
@Christian : Javascript의 모든 숫자는 배정 밀도 부동 소수점입니다.
Guffa

1
EDIT 부분이 아니라면이 질문에 대해 투표했을 것입니다
LaPuyaLoca

답변:


309

parseFloat와 Number의 차이점

parseFloat/ parseInt는 문자열을 구문 분석하기위한 것이고 Number/ +는 값을 숫자로 강제 변환하기위한 것입니다. 그들은 다르게 행동합니다. 그러나 먼저 그들이 똑같이 행동하는 곳을 살펴 봅시다.

parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000

따라서 표준 숫자 입력이 있으면 차이는 없습니다. 그러나 입력이 숫자로 시작하고 다른 문자가 포함 된 parseFloat경우 문자열에서 숫자를 자르고 숫자 Number는 제공 NaN하지 않습니다.

parseFloat('1x'); // => 1
Number('1x'); // => NaN

또한 Number16 진수 입력을 이해하지만 다음 parseFloat은 수행하지 않습니다.

parseFloat('0x10'); // => 0
Number('0x10'); // => 16

그러나 Number빈 문자열이나 공백 만 포함 된 문자열에서는 이상하게 작동합니다.

parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0

전반적으로 나는 Number더 합리적이라고 생각하므로 거의 항상 Number개인적으로 사용합니다 (그리고 많은 내부 JavaScript 함수도 사용한다는 것을 알게 될 것입니다 Number). 누군가 '1x'입력하면 마치 마치 마치 입력 한 것처럼 처리하는 것보다 오류를 표시하는 것을 선호합니다 '1'. 나는 경우가있는 숫자에 스타일을 변환하고 때 정말 예외를 만들 수있는 유일한 시간입니다 parseFloat스타일과 같은 형태로 제공하기 때문에 도움이 될 것입니다 '3px'경우에 나는 드롭 할, 'px'일부 단지를 얻을 3내가 찾을 수 있도록 parseFloat도움 여기. 그러나 실제로 당신이 선택한 것은 당신에게 달려 있으며 어떤 형태의 입력을 받아들이고 싶습니까?

단항 +연산자를 사용 Number하는 것은 함수 로 사용하는 것과 정확히 같습니다.

Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40

그래서 나는 보통 +짧게 사용 합니다. 당신이 무엇을하는지 아는 한, 쉽게 읽을 수 있습니다.


2
나는 공백 => 0 동작을 Number()"이상한"것으로 간주하지 않을 것이며, 더 기대되는 것으로 간주하고 공백은 빈 값이지만 null / undefined가 아닙니다 => 0은 좋은 결과입니다. 어쨌든 쇼케이스를위한 큰 (+) :)
jave.web

4
@NathanWall : 언급 될 가능성이있는 Number('Infinity') === Infinity반면에parseInt('Infinity') === NaN
sstur

3
+이전 행에서 세미콜론을 잊어 버린 경우 추가 표현식이 대신 평가 될 수 있으므로 (단일 더하기)를 사용하지 않습니다 .
Jackson

1
필자의 경우 parseFloat가 1 %에서 15 % 더 느리다는 것을 알았습니다. 문자열의 십진수가 증가하면 느려집니다. 내 시스템에서 1M 실행으로 parseFloat ( '1.501')는 Number ( '1.501')보다 5 % 느리고 parseFloat ( '1.50137585467')는 Number ( '1.50137585467')보다 15 % 느립니다. 그래서 Number ()로갑니다.
bytepan

1
@ ChrisBrownie55 와우, 잘 잡아라. parseFloat가 그렇게 할 수 있다는 것을 몰랐습니다. 나는 무한대가 정수가 아니라고 생각합니다!
sstur

9

입력이 "적절한 숫자"가 아닌 경우 차이점이 발생합니다. "가능한 한"구문 분석 하는 동안 Number리턴합니다 . 빈 문자열에서 호출하는 경우 반환 에서는 parseFloat 반환하면서 .NaNparseFloatNumber0NaN

예를 들면 다음과 같습니다.

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32

4
참고 NaN != NaN하지만
Wex

@Wex Oh TRUE로NaN != NaN 평가되는 의견 -팁 주셔서 감사합니다!
jave.web

4
사용할 때는 isNaN ()를 NaN의 값을 테스트하기 위해 isNaN(NaN)반환true
jave.web

5

이 예제에서 차이점을 볼 수 있습니다.

Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;

parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;

parseFloat는 문자열에서 숫자의 첫 번째 모양을 검색하기 때문에 약간 느립니다. 반면 Number 구성자는 공백이있는 숫자 값이 포함되거나 false 값이 포함 된 문자열에서 새 숫자 인스턴스를 만듭니다.

추신 일부 범용 유형 변환 솔루션에 관심이 있다면 내 블로그에서 유형 변환에 대한 게시물을 읽을 수 있습니다. http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html


2

빈 문자열의 경우에는 다릅니다.

+""그리고 Number("")0을 반환, 동안 parseFloat("")반환 NaN가.


2
나는 parseFloat()빈 문자열이 올바른 결과가 아닌 숫자 0(읽기 : NaN)가 아니라 문자 "0"가 있는 문자열은 IS 0라고 말할 수 있습니다 .
Christopher

+x반환 0빈 문자열뿐만 아니라 공백 전용 문자열뿐만 아닙니다. 예를 들면 : +" ", +"\t\t\t", +"\n\n"- 그들 모두 제공 0결과로
루카스 Wiktor에게

2

내가 아는 한, 이것은 동료들로부터 만 들었으므로 완전히 알려지지 않았을 수 있습니다. parseFloat는 조금 더 빠릅니다.

추가 연구가 진행되었지만이 성능 차이는 브라우저에 따라 다릅니다.

http://jsperf.com/parseint-vs-parsefloat/6

이 jsPerf 결과를보고 전화하십시오. (+ x 테스트도 포함)

의 '@xdazz에서 언급 한 바와 같이 대답 +""하고 Number("")복귀 0하면서 parseFloat("")반환 NaN빈 문자열이 숫자 0을 의미하지 않기 때문에 그래서 다시 내가에서는 parseFloat와 함께 갈 것은, 문자 만 문자열 "0"은 0을 의미에;


여기의 보다 철저한 테스트 변환하는 빠른 방법 낚시는 ... parseFloat()여전히 승자입니다.
mindplay.dk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.