[javascript] 자바 스크립트에서 NaN을 0으로 변환

if 문없이 NaN 값을 0으로 변환하는 방법이 있습니까?

if (isNaN(a)) a = 0;

매번 변수를 확인하는 것은 매우 성가신 일입니다.



답변

당신은 이것을 할 수 있습니다 :

a = a || 0

…을 “falsey”값에서로 변환합니다 0.

“falsey”값은 다음과 같습니다.

  • false
  • null
  • undefined
  • 0
  • "" (빈 문자열)
  • NaN (숫자가 아님)

또는 원하는 경우 :

a = a ? a : 0;

… 위와 같은 효과가 있습니다.


의도가 just 이상을 테스트하려는 경우 NaN동일한 작업을 수행 할 수 있지만 toNumber 변환을 먼저 수행하십시오.

a = +a || 0

단항 + 연산자를 사용하여 a숫자 로 변환하려고합니다 . 숫자 문자열과 같은 것을 변환하는 이점이 있습니다.'123' .

누군가 예상치 못한 것은 숫자로 변환 할 수있는 Array를 전달하는 경우입니다.

+['123']  // 123

여기에 숫자 문자열 인 단일 멤버가있는 Array가 있습니다. 숫자로 성공적으로 변환됩니다.


답변

이중 물결표를 사용하면 (더블 비트 NOT)– ~~JavaScript에서 흥미로운 작업을 수행합니다. 예를 들어, 대신 Math.floor또는 대안으로 사용할 수 있습니다 parseInt("123", 10)! 웹에서 많이 논의되었으므로 여기서 작동하는 이유는 다루지 않지만 관심이 있다면 JavaScript의 “double tilde”(~~) 연산자는 무엇입니까?

우리는 이중 물결표 의이 속성 NaN을 사용하여 숫자 로 변환 할 수 있으며 행복하게도 숫자는 0입니다!

console.log(~~NaN); // 0


답변

자신의 방법을 작성하고 숫자 값을 원하는 모든 곳에서 사용하십시오.

function getNum(val) {
   if (isNaN(val)) {
     return 0;
   }
   return val;
}


답변

무엇보다 간단하고 효과적인 것 :

function getNum(val) {
   val = +val || 0
   return val;
}

…을 “falsey”값에서로 변환합니다 0.

“falsey”값은 다음과 같습니다.

  • false
  • null
  • undefined
  • 0
  • "" (빈 문자열)
  • NaN (숫자가 아님)

답변

계속해서 사용할 수 있도록하기보다는 백업하지 말고 왜 처음에 NaN을 사용하는지 궁금하십니까?

연산에 대한 숫자 입력이 NaN 인 경우 출력도 NaN이됩니다. 이것이 현재 IEEE 부동 소수점 표준이 작동하는 방식입니다 (Javascript만이 아닙니다). 그 행동은 좋은 이유입니다 . 근본적인 의도는 가짜를 깨닫지 않고 가짜 결과를 사용하지 못하게하는 것입니다.

NaN이 작동하는 방식은 일부 하위 하위 작업에서 문제가 발생하면 (낮은 수준에서 NaN 생성) 최종 결과는 NaN이되어 NaN이됩니다. 오류 처리 로직 (throw / catch 어쩌면?)이 아직 완료되지 않았습니다.

산술 계산의 결과로 NaN 항상 세부 사항에서 무언가 잘못되었다는 것을 나타냅니다. 컴퓨터가 “여기에 논쟁이 필요하다”고 말하는 방법입니다. 어쨌든 거의 맞지 않는 숫자 (0은 실제로 원하는 것입니까?)로 계속 진행하는 방법을 찾는 대신 문제를 찾아서 해결하십시오.

Javascript의 일반적인 문제 는 무의미한 인수가 주어지면 NaN을 반환 parseInt(...)하고 parseFloat(...)반환 한다는 것입니다.null ,'' 등). 높은 수준이 아닌 가능한 가장 낮은 수준에서 문제를 해결하십시오. 그런 다음 전체 계산 결과가 의미가있을 가능성이 높으며 전체 계산 결과에 마법의 숫자 (0 또는 1 등)를 대치하지 않습니다. ((parseInt (foo.value) || 0)의 트릭은 제품이 아닌 합계에 대해서만 작동합니다. 제품의 경우 기본값이 0이 아닌 1이 되길 원하지만 지정된 값이 실제로 0이면 그렇지 않습니다.

코딩이 쉽도록 사용자가 값을 가져 와서 정리하고 필요한 경우 기본값을 제공하는 함수가 필요합니다.

function getFoobarFromUser(elementid) {
        var foobar = parseFloat(document.getElementById(elementid).innerHTML)
        if (isNaN(foobar)) foobar = 3.21;       // default value
        return(foobar.toFixed(2));
}


답변

방법에 대한 정규식 ?

function getNum(str) {
  return /[-+]?[0-9]*\.?[0-9]+/.test(str)?parseFloat(str):0;
}

아래 코드는 NaN을 무시하여 올바르게 입력 한 숫자를 계산할 수 있도록합니다.


답변

parseInt를 사용하려고하면 isNaN을 사용하는 메소드가 작동하지 않습니다. 예를 들면 다음과 같습니다.

parseInt("abc"); // NaN
parseInt(""); // NaN
parseInt("14px"); // 14

그러나 두 번째 경우 isNaN은 false를 생성합니다 (예 : null 문자열은 숫자 임)

n="abc"; isNaN(n) ? 0 : parseInt(n); // 0
n=""; isNaN(n) ? 0: parseInt(n); // NaN
n="14px"; isNaN(n) ? 0 : parseInt(n); // 14

요약하면 null 문자열은 isNaN에서 유효한 숫자로 간주되지만 parseInt에서는 유효하지 않습니다. OSX Mojave의 Safari, Firefox 및 Chrome에서 확인되었습니다.