문제

간단한 질문이 있습니다(희망합니다!).JS에서는 왜 isNaN(" ") 거짓으로 평가하지만 isNaN(" x") 사실로 평가?

텍스트 입력 필드에 숫자 연산을 수행하고 필드가 null, "" 또는 NaN인지 확인하고 있습니다.누군가 필드에 몇 개의 공백을 입력하면 세 가지 모두에 대한 유효성 검사가 실패하고 isNAN 검사를 통과한 이유가 무엇인지 혼란스럽습니다.

감사해요!

도움이 되었습니까?

해결책

JavaScript는 빈 문자열을 0으로 해석 한 다음 ISNAN 테스트에 실패합니다. 공허한 문자열을 0으로 변환하지 않으면 먼저 문자열에서 parseint를 사용할 수 있습니다. 그러면 결과가 실패해야합니다.

다른 팁

이 놀랍도록 찾을 수는 없지만 자바 스크립트 엔진의 엉뚱함을 보여주는 테스트 코드가 있습니다.

document.write(isNaN("")) // false
document.write(isNaN(" "))  // false
document.write(isNaN(0))  // false
document.write(isNaN(null)) // false
document.write(isNaN(false))  // false
document.write("" == false)  // true
document.write("" == 0)  // true
document.write(" " == 0)  // true
document.write(" " == false)  // true
document.write(0 == false) // true
document.write(" " == "") // false

그래서 이것은 그것을 의미합니다

" " == 0 == false

그리고

"" == 0 == false

하지만

"" != " "

재미있게 보내세요 :)

더 잘 이해하려면 열어주세요 ecma-script 사양 PDF 43 페이지의 "문자열 유형에 적용 된 톤 럼버"

문자열에 숫자 구문이있는 경우 흰색 공간 문자가 다수를 포함 할 수있는 경우 숫자 유형으로 변환 할 수 있습니다. 빈 문자열은 0으로 평가합니다. 또한 문자열 '인피니티'는 주어야합니다.

isNaN('Infinity'); // false

사용해보십시오 :

alert(isNaN(parseInt("   ")));

또는

alert(isNaN(parseFloat("    ")));

에서 MDN 당신이 직면 한 문제의 이유

ISNAN 함수에 대한 인수가 유형 번호가 아닌 경우, 값은 먼저 숫자로 강요됩니다. 그런 다음 결과 값을 테스트하여 NAN인지 확인합니다.

평등에 대한 NAN 비교를 다루는 다음 포괄적 인 답변을 확인할 수도 있습니다.

JavaScript 변수인지 테스트하는 방법 NaN

JavaScript의 타이핑 때문이라고 생각합니다. ' ' 반면 0으로 변환됩니다 'x' 그렇지 않다 :

alert(' ' * 1); // 0
alert('x' * 1); // NaN

정확한 ISNUMBER 기능을 구현하려면 다음과 같은 방법이 있습니다. JavaScript : 좋은 부분 작성자 : Douglas Crockford [페이지 105

var isNumber = function isNumber(value) {
   return typeof value === 'number' && 
   isFinite(value);
}

대단하지 않은 답변

안토니오 헤일리 고도로 투자되고 받아 들여진 답변 여기 에서이 프로세스가 JavaScript의 parseInt 기능:

문자열에서 parseint를 사용할 수 있습니다 ... 결과는 ISNAN에 실패해야합니다.

우리는 문자열 로이 문장을 쉽게 반증 할 수 있습니다 "123abc":

parseInt("123abc")    // 123     (a number...
isNaN("123abc")       // true     ...which is not a number)

이를 통해 JavaScript를 볼 수 있습니다 parseInt 기능이 반환됩니다 "123abc" 숫자로 123, 그러나 그것 isNaN 기능은 우리에게 그것을 알려줍니다 "123abc" 그렇지 않습니다 숫자.

정답

ecmascript-262는 방법을 정의합니다 isNaN 확인이 확인됩니다 섹션 18.2.3.

18.2.3 isNaN (숫자)

그만큼 isNaN 기능은 다음과 같습니다 %isNaN% 본질적인 대상. 때 isNaN 기능은 하나의 인수 번호로 호출되며 다음 단계는 다음과 같습니다.

  1. 허락하다 num 이다 ? ToNumber(number).
  2. 만약에 num ~이다 NaN, 반품 true.
  3. 그렇지 않으면 반환하십시오 false.

그만큼 ToNumber 기능 IT 참조도 정의됩니다 ECMAScript-262의 섹션 7.1.3. 여기에서 우리는 JavaScript가 어떻게이 함수에 전달되는 문자열을 처리하는지 알게됩니다.

질문에 주어진 첫 번째 예는 공백 문자 외에는 아무것도 포함하지 않는 문자열입니다. 이 섹션은 다음을 나타냅니다.

StringNumericLiteral 비어 있거나 화이트 스페이스 만 변환됩니다. +0.

그만큼 " " 따라서 예제 문자열이 변환됩니다 +0, 숫자입니다.

동일한 섹션에도 다음과 같이 표시됩니다.

문법이 해석 할 수없는 경우 String 확장으로 StringNumericLiteral, 그런 다음 결과 ToNumber ~이다 NaN.

해당 섹션에 포함 된 모든 수표를 인용하지 않고 " x" 질문에 주어진 예는 위의 조건에 속합니다. StringNumericLiteral. " x" 따라서 변환됩니다 NaN.

잘 모르겠습니다 , 그러나 문제를 해결하기 위해 확인하기 전에 항상 공백을 다듬을 수 있습니다. 어쨌든 당신은 아마 그렇게하고 싶을 것입니다.

함수 isNaN("") 수행 a 숫자로 문자열 강요 유형

ECMAScript 3-5 유형 연산자의 다음 반환 값을 정의합니다.

  • 한정되지 않은
  • 객체 (null, 객체, 배열)
  • 부울
  • 숫자
  • 기능

기능 본문에서 테스트를 마무리하는 것이 좋습니다.

function isNumber (s) {
    return typeof s == 'number'? true
           : typeof s == 'string'? (s.trim() === ''? false : !isNaN(s))
           : (typeof s).match(/object|function/)? false
           : !isNaN(s)
}

이 기능은 변수를 테스트 할 의도가 없습니다 유형, 대신 테스트합니다 강제 가치. 예를 들어, 부울과 줄은 숫자로 강요 되므로이 기능을 다음과 같이 부를 수 있습니다. isNumberCoerced()

테스트 할 필요가없는 경우 유형 이것 말고도 그리고 숫자, 그런 다음 다음 스 니펫이 일부 조건의 일부로 사용될 수 있습니다.

if (!isNaN(s) && s.toString().trim()!='') // 's' can be boolean, number or string
    alert("s is a number")

정수인지 실제로 적절한 점검을 원한다면 다음 기능을 사용하는 것이 좋습니다.

function isInteger(s)
{
   return Math.ceil(s) == Math.floor(s);
}

저것 isNaN(" ") 거짓은 혼란스러운 행동의 일부입니다. isNaN 숫자가 아닌 사람들의 강요로 인한 글로벌 기능.

에서 MDN:

가장 초기의 버전 이후 isNaN 함수 사양, 비 언어 인수에 대한 동작은 혼란 스럽습니다. 논쟁이 isNaN 함수는 유형 번호가 아니며 값은 먼저 숫자로 강요됩니다. 그런 다음 결과 값이 테스트되어 NaN. 따라서 숫자 유형에 강요 될 때 유효한 비 NAN 숫자 값 (특히 빈 문자열 및 부울 프리미티브를 초래할 때 강요 될 때 숫자 값이 0 또는 1을 제공 할 때, "false"반환 된 값이 예상치 못한 일 수 있습니다. 예를 들어, 빈 문자열은 반드시 "숫자가 아닙니다"입니다.

또한 ECMAScript 6에는 이제 Number.isNaN MDN에 따르면 방법 :

글로벌에 비해 isNaN() 기능, Number.isNaN() 매개 변수를 숫자로 강력하게 변환하는 문제가 발생하지 않습니다. 이것은 이제 일반적으로 변환하는 값을 전달하는 것이 안전하다는 것을 의미합니다. NaN, 그러나 실제로는 같은 가치가 아닙니다 NaN. 이것은 또한 유형 번호의 값 만 NaN, 반품 true.

안타깝게도:

심지어 ECMAScript 6 Number.isNaN 메소드에는 블로그 게시물에 요약 된대로 자체 문제가 있습니다. 못생긴 JavaScript 및 ES6 NAN 문제를 해결합니다.

다른 설명대로 isNaN 함수는 빈 문자열을 검증하기 전에 숫자로 강화하여 빈 문자열을 0으로 변경합니다 (유효한 숫자). 그러나 나는 그것을 발견했다 parseInt 기능이 돌아옵니다 NaN 빈 문자열 또는 공백 만있는 문자열을 구문 분석하려고 할 때. 따라서 다음 조합은 잘 작동하는 것 같습니다.

if ( isNaN(string) || isNaN(parseInt(string)) ) console.log('Not a number!');

이 점검은 소수점의 양수, 음수 및 숫자에 대해 작동하므로 모든 일반적인 숫자 사례를 다루고 있다고 생각합니다.

이 기능은 내 테스트에서 작동하는 것처럼 보였습니다

function isNumber(s) {
    if (s === "" || s === null) {
        return false;
    } else {
        var number = parseInt(s);
        if (number == 'NaN') {
            return false;
        } else {
            return true;
        }
    }
}

는 어때

function isNumberRegex(value) {        
    var pattern = /^[-+]?\d*\.?\d*$/i;
    var match = value.match(pattern);
    return value.length > 0 && match != null;
}

그만큼 isNaN 함수는 Number를 인수로 예상하므로 다른 유형의 인수(귀하의 경우 문자열)는 Number로 변환됩니다. ~ 전에 실제 함수 로직이 수행됩니다.(이것을 알아두세요 NaN 또한 Number 유형의 값입니다!)

그런데.이것은 일반적입니다 모두 내장 함수 - 특정 유형의 인수가 필요한 경우 실제 인수는 표준 변환 함수를 사용하여 변환됩니다.모든 기본 유형(부울, 문자열, 숫자, 객체, 날짜, null, 정의되지 않음) 간에는 표준 변환이 있습니다.

표준 변환 String 에게 Number 다음을 사용하여 명시적으로 호출할 수 있습니다. Number().그래서 우리는 그것을 볼 수 있습니다:

  • Number(" ") 평가하다 0
  • Number(" x") 평가하다 NaN

이를 감안할 때, isNaN 함수는 완전히 논리적입니다!

진짜 질문은 표준 문자열-숫자 변환이 왜 그렇게 작동하는지입니다.문자열을 숫자로 변환하는 것은 실제로 "123" 또는 "17.5e4"와 같은 숫자 문자열을 동등한 숫자로 변환하기 위한 것입니다.변환은 먼저 초기 공백을 건너뛴 다음(따라서 " 123"이 유효함) 나머지 부분을 숫자로 구문 분석하려고 시도합니다.숫자로 구문 분석할 수 없는 경우("x"는 구문 분석할 수 없음) 결과는 NaN입니다.그러나 비어 있거나 공백만 있는 문자열은 0으로 변환된다는 명시적인 특수 규칙이 있습니다.이것이 변환을 설명합니다.

참조: http://www.ecma-international.org/ecma-262/5.1/#sec-9.3.1

이 문제를 해결하는 데 도움이되는이 빠른 기능을 썼습니다.

function isNumber(val) {
     return (val != undefined && val != null && val.toString().length > 0 && val.toString().match(/[^0-9\.\-]/g) == null);
};

그것은 단순히 숫자가 아닌 문자 (0-9), '-'또는 '. :)

그만큼 자바 스크립트 내장 Isnan 함수, 기본적으로 예상되는 바와 같이 - "동적 유형 연산자". 따라서 (DTC 프로세스 동안) 간단한 진실을 생성 할 수있는 모든 값 | 같은 거짓 "", " ", " 000", Nan이 될 수 없습니다.

그 의미 논쟁 제공된 것은 먼저 a 변환 에서와 같이 :

function isNaNDemo(arg){
   var x = new Number(arg).valueOf();
   return x != x;
}

설명:

기능 본문의 최상위 라인에서, 우리는 (첫 번째) 인수를 숫자 객체로 성공적으로 변환하려고 노력하고 있습니다. 그리고 (두 번째), 도트 연산자를 사용하여 우리는 - 우리 자신의 편의를 위해 즉시 스트리핑, 그만큼 원어 생성 된 객체의.

두 번째 줄에서는 이전 단계에서 얻은 가치와 사실의 이점을 취하고 있습니다. 우주의 어떤 것도 같지 않으며, 그 자체도 마찬가지입니다. NaN == NaN >> false 마지막으로 (불평등) 자체를 비교합니다.

이런 식으로 함수 리턴이 생성됩니다 진실 제공된 인수 반환이 숫자 객체, 즉 숫자가 아닌 숫자로의 전환 시도에 실패한 경우에만; 예, 난.


isnanstatic ()

그러나 정적 유형 연산자의 경우 - 필요한 경우 및 필요한 경우 - 우리는 다음과 같은 훨씬 간단한 기능을 작성할 수 있습니다.

function isNaNstatic(x){   
   return x != x;
}

인수가 명시 적으로 NAN 번호가 아닌 경우 거짓을 반환 할 수 있도록 DTC를 모두 피하십시오. 따라서 다음에 대한 테스트 :

isNaNStatic(" x"); // will return false 여전히 끈이기 때문입니다.

하지만:isNaNStatic(1/"x"); // will of course return true. 예를 들어 isNaNStatic(NaN); >> true.

그러나 반대 isNaN,, isNaNStatic("NaN"); >> false 그것 (인수)은 일반적인 문자열이기 때문입니다.

추신 : ISNAN의 정적 버전은 현대 코딩 시나리오에서 매우 유용 할 수 있습니다. 그리고 이것이 내가 이것을 게시하는 데 시간이 걸린 주된 이유 중 하나일지도 모릅니다.

문안 인사.

isNAN(<argument>) 주어진 인수가 불법 번호인지 여부를 알리는 기능입니다.isNaN 인수를 숫자 유형으로 분류합니다. 인수가 숫자인지 아닌지 확인하려면? 이용 해주세요 $.isNumeric() jQuery에서 기능.

즉, Isnan (foo)은 Isnan (숫자 (foo))와 동일합니다. 그것은 명백한 이유로 모든 숫자를 가진 모든 문자열을 받아들입니다. 전.

isNaN(123) //false
isNaN(-1.23) //false
isNaN(5-2) //false
isNaN(0) //false
isNaN('123') //false
isNaN('Hello') //true
isNaN('2005/12/12') //true
isNaN('') //false
isNaN(true) //false
isNaN(undefined) //true
isNaN('NaN') //true
isNaN(NaN) //true
isNaN(0 / 0) //true

나는 이것을 사용한다

    function isNotANumeric(val) {
    	if(val.trim && val.trim() == "") {
         return true;
      } else {
      	 return isNaN(parseFloat(val * 1));
      }
    }
    
    alert(isNotANumeric("100"));  // false
    alert(isNotANumeric("1a"));   // true
    alert(isNotANumeric(""));     // true
    alert(isNotANumeric("   "));  // true

NaN ! == "숫자가 아님"

NaN 숫자 유형의 값입니다

이것은 ecmascript에서 isnan ()의 정의입니다.

1. Let num be ToNumber(number).
2. ReturnIfAbrupt(num).
3. If num is NaN, return true.
4. Otherwise, return false.

모든 값을 숫자로 변환하십시오.

Number(" ") // 0
Number("x") // NaN
Number(null) // 0

값이 있는지 확인하려면 NaN, 먼저 숫자 값으로 변환해야합니다.

공백으로 특정 문자열 값을 확인할 때 또는 " "~이다 isNaN 문자열 유효성 검사를 수행하려고 시도 할 수 있습니다. 예 :

// value = "123 " if (value.match(/\s/) || isNaN(value)) { // do something }

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top