찾다

JavaScript의 NaN

Jun 29, 2020 am 10:42 AM
javascript

  1. NaN은 무엇인가요
  2. NaN
  3. 什么时候会返回 NaN
  4. 判断 NaN
  5. 参考

什么是 NaN

在 MDN 的 NaN 文章中有描述:

  • 全局属性 NaN 表示 Not-A-Number 的值。
  • NaN 是一个全局对象的属性。
  • NaN 属性的初始值就是 NaN,和 Number.NaN 的值一样。
  • 在 ES5 中, NaN 属性是一个不可配置(non-configurable),不可写(non-writable)的属性。但在 ES3 中,这个属性的值是可以被更改的,但是也应该避免覆盖。
  • 通常都是在计算失败时,作为 Math 的某个方法的返回值出现的(例如:Math.sqrt(-1))或者尝试将一个字符串解析成数字但失败了的时候(例如:parseInt("blabla"))。

NaN 的类型

typeof NaN   // "number"

也就是说 NaN 是一种特殊的 Number 类型值。

什么时候会返回 NaN

JavaScript 权威指南 中『3.1.3 JavaScript 中的算数运算』章节里有描述:

无穷大除以无穷大、给任意负数做开方运算 或者 算数运算符与不是数字或无法转换为数字的操作数一起使用时都将返回 NaN

可分开解释为以下等情况:

  • 无穷大除以无穷大
  • 给任意负数做开方运算
  • 算数运算符与不是数字或无法转换为数字的操作数一起使用
  • 字符串解析成数字

以下结果都是 NaN

Infinity / Infinity;   // 无穷大除以无穷大
Math.sqrt(-1);         // 给任意负数做开方运算
'a' - 1;               // 算数运算符与不是数字或无法转换为数字的操作数一起使用
'a' * 1;
'a' / 1;
parseInt('a');         // 字符串解析成数字
parseFloat('a');

这里的『无法转换为数字的操作』又是什么鬼?

先看下面可以转换为数字的操作例子:

Math.sqrt('4');        // 2
2 * '2';               // 4
'4' / 2;               // 2

无法转换为数字的操作

这里涉及到 JavaScript 的 类型转换 的概念。

JavaScript 权威指南 『3.8 类型转换』章节有描述:

如果 JavaScript 期望使用一个数字,它把给定的值将转换为数字(如果转换结果无意义的话将返回 NaN)。

可以使用 Number() 方法做显式类型转换,举例:

Number('1');           // 1
Number(null);          // 0
Number('a');           // NaN

也可以使用一元运算符 + 做隐式转换,举例:

+'1';                  // 1
+null;                 // 0
+'a';                  // NaN

也可以使用全局函数 parseInt()parseFloat() 解析整数和浮点数,举例:

parseInt('12');        // 12
parseInt('12a');       // 12
parseInt('a12');       // NaN
parseInt(null);        // NaN

parseInt()parseFloat() 可以简单理解为:

尽可能解析更多数值字符,并且忽略后面的内容;如果第一个非空格字符是非数字,则会返回 NaN

需要注意的是 Number()parseInt()``parseFloat() ,对某些输入值的处理不同,如 null

非数字类型转换 为 数字类型,如下表汇总:

数字
undefined NaN
null 0
true 1
false 0
"" (空字符串) 0
"1.2" (非空,数字) 1.2
"one" (非空,非数字) NaN
[] (任意对象) 0
[9] (一个数字元素) 9
['a'] (其他数组) NaN
function(){} (任意函数) NaN

如何判断 NaN

首先全局的 isNaN() 函数不能严格判断输入值是否为 NaN

isNaN() 的怪异行为

在 MDN 的 isNaN() 文章中对 非数值参数 所表现的『怪异行为』有解释:

它会先尝试将这个参数转换为数值,然后才会对转换后的结果是否是 NaN 进行判断。

因此,对于能被强制转换为有效的非 NaN 数值来说,返回 false 值也许会让人感觉莫名其妙。

如下例子:

isNaN('37');      // false: 可以被转换成数值 37
isNaN('');        // false: 空字符串被转换成 0

严格判断 NaN

参考 MDN 中 Number.isNaN()NaN은 언제 반환되나요

NaN 판단

참고

NaN이 무엇인가요MDN의 NaN 기사에 설명되어 있습니다:
    전역 속성 NaN은 Not-A-Number의 값을 나타냅니다. 🎜NaN은 전역 개체의 속성입니다. 🎜NaN 속성의 초기값은 NaN이며 이는 Number.NaN의 값과 동일합니다. 🎜ES5에서 NaN 속성은 구성할 수 없고 쓸 수 없는 속성입니다. 하지만 ES3에서는 이 속성의 값을 변경할 수 있지만 덮어쓰기는 피해야 합니다. 🎜일반적으로 계산이 실패하거나(예: Math.sqrt(-1)) 문자열을 숫자로 구문 분석하려고 시도했지만 실패했을 때 Math 메서드의 반환 값으로 나타납니다( 예: parseInt("blabla")).

NaN의 유형

typeof value === 'number' && isNaN(value)
🎜즉, NaN은 특별한 Number 유형 값입니다. . 🎜

NaN은 언제 반환되나요?

🎜JavaScript에 대한 권위 있는 가이드의 "3.1.3 JavaScript의 산술 연산" 장에 설명이 있습니다. 🎜
🎜무한대를 무한대로 나누고 제곱근을 수행합니다. 음수에 대한 연산 또는 숫자가 아니거나 숫자로 변환할 수 없는 피연산자와 함께 사용된 산술 연산자는 NaN을 반환합니다. 🎜
🎜 다음 상황으로 별도로 해석될 수 있습니다: 🎜
    🎜무한대를 무한대로 나눈 값🎜음수에 대해 제곱근 연산을 수행합니다.🎜산술 연산자이며 숫자가 아닙니다. 또는 숫자 피연산자를 함께 사용으로 변환할 수 없습니다.🎜문자열을 숫자로 구문 분석
🎜다음 결과는 모두 NaN입니다. 🎜rrreee🎜여기의 연산은 변환할 수 없습니다. 숫자에 "그건 또 뭐야?" 🎜🎜먼저 숫자로 변환할 수 있는 연산의 다음 예를 살펴보세요. 🎜rrreee

숫자로 변환할 수 없는 연산

🎜이것은 JavaScript의 유형 변환 개념과 관련이 있습니다. 🎜🎜JavaScript 최종 가이드 "3.8 유형 변환" 장에는 다음과 같은 설명이 있습니다. 🎜
🎜JavaScript가 숫자를 기대하는 경우 주어진 값을 숫자로 변환합니다(변환 결과가 의미가 없으면 NaN이 반환됩니다). 🎜
🎜명시적 유형 변환에는 Number() 메서드를 사용할 수 있습니다. 예: 🎜rrreee🎜암시적 변환에는 단항 연산자 +를 사용할 수도 있습니다. , 예:🎜rrreee🎜또한 전역 함수 parseInt()parseFloat()를 사용하여 정수와 부동 소수점 숫자를 구문 분석할 수 있습니다. 예: 🎜rrreee🎜parseInt() 및 parseFloat()는 다음과 같이 간단하게 이해할 수 있습니다. 🎜
🎜가능한 많은 숫자 문자를 구문 분석하고 첫 번째가 공백이 아닌 경우 다음 내용을 무시합니다. 문자가 숫자가 아니면 NaN🎜
🎜을 반환합니다. Number()parseInt()``parseFloat( ), 일부 입력 값의 경우 null과 같이 다르게 처리됩니다. 🎜🎜다음 표에 요약된 것처럼 숫자가 아닌 유형은 숫자 유형으로 변환됩니다. 🎜 NaN tr>
value 숫자
정의되지 않음
null 0 td>
1
false 0
""(빈 문자열) 0
"1.2"(비어 있지 않음, 숫자) 1.2
" 1"(비어 있지 않음, 숫자가 아님) NaN
[ ](모든 개체) 0
[9] (숫자 요소 1개) 9
[' a'] (기타 배열) NaN
function() {}(모든 함수) NaN

NaN 판단 방법

🎜우선, 전역 isNaN() 함수로는 입력값이 NaN인지 여부를 엄밀히 판단할 수 없습니다. 🎜

isNaN()의 이상한 동작

🎜MDN의 isNaN() 기사에는 숫자가 아닌 매개변수 :🎜
🎜먼저 이 매개변수를 숫자 값으로 변환한 다음 변환된 결과가 NaN인지 판단합니다. 🎜
🎜따라서 유효한 값으로 강제 변환될 수 있는 NaN이 아닌 값에 대해 false 값을 반환하는 것은 혼란스러울 수 있습니다. 🎜
🎜다음 예: 🎜rrreee

NaN을 엄격하게 판단

🎜MDN에 있는 Number.isNaN()의 Polyfill 코드를 참조하세요. 🎜rrreee🎜권장 튜토리얼: "🎜JS 튜토리얼🎜》🎜

위 내용은 JavaScript의 NaN의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 简书에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
JavaScript 엔진 : 구현 비교JavaScript 엔진 : 구현 비교Apr 13, 2025 am 12:05 AM

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

브라우저 너머 : 실제 세계의 JavaScript브라우저 너머 : 실제 세계의 JavaScriptApr 12, 2025 am 12:06 AM

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

Next.js (백엔드 통합)로 멀티 테넌트 SAAS 애플리케이션 구축Next.js (백엔드 통합)로 멀티 테넌트 SAAS 애플리케이션 구축Apr 11, 2025 am 08:23 AM

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

Next.js (Frontend Integration)를 사용하여 멀티 테넌트 SaaS 응용 프로그램을 구축하는 방법Next.js (Frontend Integration)를 사용하여 멀티 테넌트 SaaS 응용 프로그램을 구축하는 방법Apr 11, 2025 am 08:22 AM

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

JavaScript : 웹 언어의 다양성 탐색JavaScript : 웹 언어의 다양성 탐색Apr 11, 2025 am 12:01 AM

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

JavaScript의 진화 : 현재 동향과 미래 전망JavaScript의 진화 : 현재 동향과 미래 전망Apr 10, 2025 am 09:33 AM

JavaScript의 최신 트렌드에는 Typescript의 Rise, 현대 프레임 워크 및 라이브러리의 인기 및 WebAssembly의 적용이 포함됩니다. 향후 전망은보다 강력한 유형 시스템, 서버 측 JavaScript 개발, 인공 지능 및 기계 학습의 확장, IoT 및 Edge 컴퓨팅의 잠재력을 포함합니다.

Demystifying JavaScript : 그것이하는 일과 중요한 이유Demystifying JavaScript : 그것이하는 일과 중요한 이유Apr 09, 2025 am 12:07 AM

JavaScript는 현대 웹 개발의 초석이며 주요 기능에는 이벤트 중심 프로그래밍, 동적 컨텐츠 생성 및 비동기 프로그래밍이 포함됩니다. 1) 이벤트 중심 프로그래밍을 사용하면 사용자 작업에 따라 웹 페이지가 동적으로 변경 될 수 있습니다. 2) 동적 컨텐츠 생성을 사용하면 조건에 따라 페이지 컨텐츠를 조정할 수 있습니다. 3) 비동기 프로그래밍은 사용자 인터페이스가 차단되지 않도록합니다. JavaScript는 웹 상호 작용, 단일 페이지 응용 프로그램 및 서버 측 개발에 널리 사용되며 사용자 경험 및 크로스 플랫폼 개발의 유연성을 크게 향상시킵니다.

Python 또는 JavaScript가 더 좋습니까?Python 또는 JavaScript가 더 좋습니까?Apr 06, 2025 am 12:14 AM

Python은 데이터 과학 및 기계 학습에 더 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 더 적합합니다. 1. Python은 간결한 구문 및 풍부한 라이브러리 생태계로 유명하며 데이터 분석 및 웹 개발에 적합합니다. 2. JavaScript는 프론트 엔드 개발의 핵심입니다. Node.js는 서버 측 프로그래밍을 지원하며 풀 스택 개발에 적합합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.