[javascript] typeof NaN이 왜 ‘number’를 반환합니까?

그냥 호기심.

typeof NaN숫자 인 것은 논리적이지 않습니다 . 그건 그렇고 마찬가지로 거짓을 반환 NaN === NaN하거나 NaN == NaN반환합니다. 이것이 자바 스크립트의 특징 중 하나입니까, 아니면 그 이유가 있습니까?

편집 : 답변 주셔서 감사합니다. 그래도 사람들을 이끄는 것은 쉬운 일이 아닙니다. 답을 읽고 위키를 더 이해했지만 여전히 다음과 같은 문장

NaN과의 비교는 자체와 비교할 때도 항상 정렬되지 않은 결과를 반환합니다. 비교 술어는 시그널링 또는 비 시그널링이며, 시그널링 버전은 이러한 비교에 대해 유효하지 않은 예외를 신호합니다. 항등 및 부등식 술어는 신호가 없으므로 x = x false 반환은 x가 조용한 NaN인지 테스트하는 데 사용할 수 있습니다.

그냥 내 머리를 계속 돌립니다. 누군가가 (수학자와는 달리) 인간이 읽을 수있는 언어로 이것을 번역 할 수 있다면, 나는 감사 할 것이다.



답변

숫자가 아님을 의미합니다. 자바 스크립트의 특성은 아니지만 일반적인 컴퓨터 과학 원리입니다.

에서 http://en.wikipedia.org/wiki/NaN :

NaN을 반환하는 세 가지 종류의 작업이 있습니다.

하나 이상의 피연산자로 NaN을 사용하는 연산

불확실한 형태

  • 0/0, ∞ / ∞, ∞ / −∞, −∞ / ∞ 및 −∞ / −∞ 나누기
  • 곱셈 0 × ∞ 및 0 × −∞
  • 힘 1 ^ ∞
  • 더하기 ∞ + (−∞), (−∞) + ∞ 및 동등한 빼기.

복잡한 결과를 가진 실제 작업 :

  • 음수의 제곱근
  • 음수의 로그
  • 90 도의 홀수 배수의 접선 (또는 π / 2 라디안)
  • -1보다 작거나 +1보다 큰 숫자의 역 사인 또는 코사인.

이 모든 값이 같지 않을 수 있습니다. NaN에 대한 간단한 테스트는 테스트하는 것 value == value입니다.


답변

글쎄, 그것은 실제로 NaN숫자 가 아닙니다 :-)에도 불구하고 여전히 숫자 유형입니다 .

NaN단지 숫자 값의 한계 내에서 특정 값을 표현할 수 없다는 것을 의미합니다 (반올림 해야하는 모든 숫자에 대해 말할 수는 있지만 NaN특별한 경우입니다).

특정 값은 다른 값일 수 있으므로 다른 값 NaN과 동일하게 간주되지 않습니다 NaN. 그러나 NaN2718 또는 31415와 같이 여전히 숫자 유형입니다.


평신도의 용어로 설명하기 위해 업데이트 된 질문에 관해서 :

NaN과의 비교는 자체와 비교할 때도 항상 정렬되지 않은 결과를 반환합니다. 비교 술어는 시그널링 또는 비 시그널링이며, 시그널링 버전은 이러한 비교에 대해 유효하지 않은 예외를 신호합니다. 항등 및 부등식 술어는 신호가 없으므로 x = x는 false를 반환하여 x가 조용한 NaN인지 테스트하는 데 사용할 수 있습니다.

이 모든 것은 (부분으로 나뉘어 있음)입니다.

NaN과의 비교는 자체와 비교할 때도 항상 정렬되지 않은 결과를 반환합니다.

기본적으로 a NaN는 다른를 포함하여 다른 숫자와 같지 않으며 NaN심지어는 자신을 포함 합니다. .

비교 술어는 시그널링 또는 비 시그널링이며, 시그널링 버전은 이러한 비교에 대해 유효하지 않은 예외를 신호합니다.

사이의 비교 (보다 작거나 크거나 등) 작업을 시도 NaN숫자와 다른 숫자 하면 예외가 발생하거나 (신호 발생) 결과로 거짓이 될 수 있습니다 (신호가 발생하지 않거나 조용함).

항등 및 부등식 술어는 신호가 없으므로 x = x는 false를 반환하여 x가 조용한 NaN인지 테스트하는 데 사용할 수 있습니다.

동등성 (같거나 같지 않음)에 대한 테스트는 신호를 보내지 않으므로이를 사용하면 예외가 발생하지 않습니다. 정기적 번호가있는 경우 x, 다음 x == x항상 true가됩니다. 경우 xNaN다음 x == x항상 false가 될 것입니다. NaN쉽게 (조용하게) 감지하는 방법을 제공합니다 .


답변

ECMA 스크립트 (JavaScript)를 표준 지정 Numbers되어 IEEE 754 등 수레 NaN가능한 값.

ECMA 262 5e Section 4.3.19 : 숫자 값

배정도 64 비트 이진 형식 IEEE 754 값에 해당하는 기본 값.

ECMA 262 5e 섹션 4.3.23 : NaN

IEEE 754 “Not-a-Number”값인 숫자 값입니다.

Wikipedia의 IEEE 754

부동 소수점 산술에 대한 IEEE 표준은 전기 전자 학회 (Institute of Electrical and Electronics Engineers)에 의해 확립 된 기술 표준이며 부동 소수점 계산에 가장 널리 사용되는 표준입니다 …]

표준은

  • 산술 형식 : 유한 숫자 (부호있는 0 및 하위 정규수 포함), 무한대 및 특수한 숫자가 아닌 값 (NaN)으로 구성된 이진 및 십진 부동 소수점 데이터 세트

[…]


답변

typeof NaN다음과 같은 'number'이유로 반환됩니다 .

  • ECMAScript 사양에 따르면 숫자 유형에 NaN이 포함되어 있습니다.

    4.3.20 숫자 유형

    특수 “NaN (Not-a-Number)”값, 양의 무한대 및 음의 무한대를 포함하여 가능한 모든 숫자 값 세트

  • 따라서 typeof그에 따라 반환됩니다.

    11.4.3 연산자의 유형

    UnaryExpression : typeof UnaryExpression 프로덕션 은 다음과 같이 평가됩니다.

    1. 하자 발은 평가의 결과 UnaryExpression을 .
    2. 경우 유형 ( 발은 )는 참조 후,
      1. 경우 IsUnresolvableReference ( 발은 )는 사실 , 반환 "undefined".
      2. 하자 GetValue ( ).
    3. 문자열에 의해 결정 반환 유형 ( 표 20에 따라).
                    Table 20 — typeof Operator Results
    ==================================================================
    |        Type of val         |              Result               |
    ==================================================================
    | Undefined                  | "undefined"                       |
    |----------------------------------------------------------------|
    | Null                       | "object"                          |
    |----------------------------------------------------------------|
    | Boolean                    | "boolean"                         |
    |----------------------------------------------------------------|
    | Number                     | "number"                          |
    |----------------------------------------------------------------|
    | String                     | "string"                          |
    |----------------------------------------------------------------|
    | Object (native and does    | "object"                          |
    | not implement [[Call]])    |                                   |
    |----------------------------------------------------------------|
    | Object (native or host and | "function"                        |
    | does implement [[Call]])   |                                   |
    |----------------------------------------------------------------|
    | Object (host and does not  | Implementation-defined except may |
    | implement [[Call]])        | not be "undefined", "boolean",    |
    |                            | "number", or "string".            |
    ------------------------------------------------------------------

이 동작은 IEEE 부동 소수점 산술 표준 (IEEE 754)을 따릅니다 .

4.3.19 숫자 값

배정도 64 비트 이진 형식 IEEE 754 값에 해당하는 기본 값

4.3.23 NaN

IEEE 754“Not-a-Number”값인 숫자 값

8.5 숫자 타입

숫자 유형은 정확히 18437736874454810627 (즉, 2 53 -2 64 +3) 값을 가지며, 9007199254740990 (이진 부동 소수점 산술에 대한 IEEE 표준에 지정된 배정도 64 비트 형식 IEEE 754 값을 나타냄) 즉, IEEE 표준의 2 53 -2) 고유 한 “Not-a-Number”값은 단일 특수 NaN 값 으로 ECMAScript에 표시됩니다 . (점을 유의 하는 NaN 값은 프로그램의 발현에 의해 생성된다 NaN.)


답변

NaN은 유효한 부동 소수점 값입니다 ( http://en.wikipedia.org/wiki/NaN )

NaN === NaN은 반드시 숫자가 아닌 동일한 것이 아니기 때문에 false입니다.


답변

NaN != NaN동일한 숫자가 아닌 필요하지 않기 때문입니다. 따라서 많은 의미가 있습니다 … 또한 왜 floats가 +0.00과 -0.00을 모두 같지 않은지 알 수 있습니다. 반올림은 실제로 0이 아닌 것을 할 수 있습니다.

typeof는 언어에 따라 다릅니다. 그리고 대부분의 언어는 NaN이 분류 방법에 따라 float, double 또는 number라고 말합니다. 나는 이것이 알 수없는 유형이거나 널이라고 말할 언어가 없습니다.


답변

NaN숫자 아님을 나타냅니다 . 0으로 나누는 것과 같은 유효하지 않은 연산의 결과를 나타내는 숫자 데이터 유형 (일반적으로 부동 소수점 유형이지만 항상 그런 것은 아님)의 값입니다.

이름이 숫자가 아니라고 말하지만 데이터를 보유하는 데 사용되는 데이터 유형은 숫자 유형입니다. 따라서 JavaScript에서의 데이터 유형을 요구 NaN하면 number(반드시 alert(typeof(NaN))보여 주듯이) 리턴 됩니다 .