2014-07-25 3 views
1

나는 잠시 동안 다양한 상황에서 parseInt()parseFloat()을 사용 해왔다. 나는이 둘의 모든면을 잘 알고 있다고 생각하고 싶다. 그러나 최근에 나는 호기심을 가지고 생각을 해왔습니다. 나는 지금까지 확실하게 증명할 수 없었습니다.parseInt() 및 parseFloat() :이 두 번째 어설 션이 실패 할 수 있습니까?

function testProof(strInteger) { 
    assert(strInteger === '' + parseInt(strInteger, 10)); 

    assert(parseInt(strInteger, 10) === parseFloat(strInteger)); 
} 

// Sample calls... 
testProof("5"); 
testProof("109"); 
testProof("-55"); 

먼저 우리는 정수로 입력을 전환하고 문자열로 다시 변환하여 다시 원래의 스트링을 생성하는 것을 assert :

는 다음의 기능을 고려한다. 이렇게하면 parseInt("100bucks")100을 반환하는 사례를 방지하고 변환에 의해 잘리지 않는 부분이 없는지 확인합니다. 입력이 실제로 정수, 정수 문자열인지 확인하고자합니다.

성공한 경우 assertparseInt(..., 10)parseFloat(...)과 같은 값을 반환합니다.

assert이 실패 할 많은 이유가 있습니다

  • 입력이 전체 숫자가 아닌이 ("1.5")
  • 입력 앞에 0을 ("0050")
  • 입력 쓰레기 ("100bucks")를 후행 있음
  • 입력이 지수 표기법 ("1e3")이거나 너무 커서 지수가 높아집니다.
  • 입력을 구문 분석 할 수 없으므로, 결과는 NaN
  • 다른 어떤가요? 언제 까지나 처음 assert 패스가, 두 번째 assert 이제까지 실패 할 수 :

그러나 여기 질문입니까? 달리 말하자면 입력이 문자열 안의 정수라고 미리 알면 은 parseInt(..., 10)의 드롭 인 대체품으로 사용할 수 있습니까? 당신이 정말로 그것을 정수 알고 있다면, 왜 시험을

testProof("NaN"); 

을하지만 :

답변

1

실제로에만이 입력에 실패 할 수 있습니다 (P는 ... 그것은 좋은 교체의 말을하지 않음)? 또한 parseFloat는 parseInt를 대체 할 수 없으므로 실제로 정수인지 플로트인지는 알 수 없습니다.

+0

좋은 캐치! 나는 문자 적으로''NaN ''을 시도하는 것을 결코 고려하지 않았다. 그리고 나는 동의 할 것입니다. 두 가지가 다르게 작용하는 엣지 경우가 있는지를 보는 이론적 인 호기심입니다. – smitelli

+0

@smitelli 글쎄, 그들은 문자열의 내용을 모를 때만 다르게 행동합니다. 그리고 다른 한편으로 문자열 화 된 정수라고 확신한다면'+ str'이나'str * 1'을 사용하는 것이 훨씬 쉽습니다. – Razem

-1

증명할 수는 없지만 JS는 정수와 부동 소수점을 구분하지 않습니다. parseFloat와 parseInt의 유일한 차이점은 소수점 같은 것을 해석하는 방법입니다. 입력 문자열이 정규 표기법의 유효한 정수 인 경우 (첫 번째 어설 션이 주장하는대로) 항상 동일한 숫자 값을 갖게됩니다. 이는 JS에서 동일한 유형이기도 함을 의미합니다.