그냥 호기심.
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
. 그러나 NaN
2718 또는 31415와 같이 여전히 숫자 유형입니다.
평신도의 용어로 설명하기 위해 업데이트 된 질문에 관해서 :
NaN과의 비교는 자체와 비교할 때도 항상 정렬되지 않은 결과를 반환합니다. 비교 술어는 시그널링 또는 비 시그널링이며, 시그널링 버전은 이러한 비교에 대해 유효하지 않은 예외를 신호합니다. 항등 및 부등식 술어는 신호가 없으므로 x = x는 false를 반환하여 x가 조용한 NaN인지 테스트하는 데 사용할 수 있습니다.
이 모든 것은 (부분으로 나뉘어 있음)입니다.
NaN과의 비교는 자체와 비교할 때도 항상 정렬되지 않은 결과를 반환합니다.
기본적으로 a NaN
는 다른를 포함하여 다른 숫자와 같지 않으며 NaN
심지어는 자신을 포함 합니다. .
비교 술어는 시그널링 또는 비 시그널링이며, 시그널링 버전은 이러한 비교에 대해 유효하지 않은 예외를 신호합니다.
사이의 비교 (보다 작거나 크거나 등) 작업을 시도 NaN
숫자와 다른 숫자 하면 예외가 발생하거나 (신호 발생) 결과로 거짓이 될 수 있습니다 (신호가 발생하지 않거나 조용함).
항등 및 부등식 술어는 신호가 없으므로 x = x는 false를 반환하여 x가 조용한 NaN인지 테스트하는 데 사용할 수 있습니다.
동등성 (같거나 같지 않음)에 대한 테스트는 신호를 보내지 않으므로이를 사용하면 예외가 발생하지 않습니다. 정기적 번호가있는 경우 x
, 다음 x == x
항상 true가됩니다. 경우 x
인 NaN
다음 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이 포함되어 있습니다.
특수 “NaN (Not-a-Number)”값, 양의 무한대 및 음의 무한대를 포함하여 가능한 모든 숫자 값 세트
-
따라서
typeof
그에 따라 반환됩니다.UnaryExpression :
typeof
UnaryExpression 프로덕션 은 다음과 같이 평가됩니다.- 하자 발은 평가의 결과 UnaryExpression을 .
- 경우 유형 ( 발은 )는 참조 후,
- 경우 IsUnresolvableReference ( 발은 )는 사실 , 반환
"undefined"
. - 하자 발 수 GetValue ( 발 ).
- 경우 IsUnresolvableReference ( 발은 )는 사실 , 반환
- 문자열에 의해 결정 반환 유형 ( 발 표 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)을 따릅니다 .
배정도 64 비트 이진 형식 IEEE 754 값에 해당하는 기본 값
IEEE 754“Not-a-Number”값인 숫자 값
숫자 유형은 정확히 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))
보여 주듯이) 리턴 됩니다 .