나는 잠시 동안 다양한 상황에서 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
을 반환하는 사례를 방지하고 변환에 의해 잘리지 않는 부분이 없는지 확인합니다. 입력이 실제로 정수, 정수 문자열인지 확인하고자합니다.
성공한 경우 assert
은 parseInt(..., 10)
이 parseFloat(...)
과 같은 값을 반환합니다.
첫 assert
이 실패 할 많은 이유가 있습니다
- 입력이 전체 숫자가 아닌이 (
"1.5"
) - 입력 앞에 0을 (
"0050"
) - 입력 쓰레기 (
"100bucks"
)를 후행 있음 - 입력이 지수 표기법 (
"1e3"
)이거나 너무 커서 지수가 높아집니다. - 입력을 구문 분석 할 수 없으므로, 결과는
NaN
- 다른 어떤가요? 언제 까지나 처음
assert
패스가, 두 번째assert
이제까지 실패 할 수 :
그러나 여기 질문입니까? 달리 말하자면 입력이 문자열 안의 정수라고 미리 알면 은 parseInt(..., 10)
의 드롭 인 대체품으로 사용할 수 있습니까? 당신이 정말로 그것을 정수 알고 있다면, 왜 시험을
testProof("NaN");
을하지만 :
좋은 캐치! 나는 문자 적으로''NaN ''을 시도하는 것을 결코 고려하지 않았다. 그리고 나는 동의 할 것입니다. 두 가지가 다르게 작용하는 엣지 경우가 있는지를 보는 이론적 인 호기심입니다. – smitelli
@smitelli 글쎄, 그들은 문자열의 내용을 모를 때만 다르게 행동합니다. 그리고 다른 한편으로 문자열 화 된 정수라고 확신한다면'+ str'이나'str * 1'을 사용하는 것이 훨씬 쉽습니다. – Razem