在JavaScript当中,为什么NaN===NaN和NaN==NaN返回false?

2024-09-07 02:36
文章标签 java script 返回 false nan 当中

本文主要是介绍在JavaScript当中,为什么NaN===NaN和NaN==NaN返回false?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:CSDN-PleaSure乐事

欢迎大家阅读我的博客 希望大家喜欢

使用环境:vscode chrome

今天这个话题的缘由是早上和一位同专业的学长聊天,他在公司完成了一个项目,项目当中有一个40个字段的返回值,于是牵扯到了某道他遇到的面试题,其中是需要用js找到某个数组当中null的索引,然后他问了我这样一个问题:你觉得NaN===NaN吗?当时我回答了不等于,然后他又追问为什么,我回答不出。于是就有了今天这篇文章,希望能与大家分享。


目录

1.什么是NaN?

1.1定义

1.2特点

1.2.1不等于任何值

1.2.2不可比较性

1.2.3类型为number

1.3如何判断NaN

1.3.1使用isNaN()

1.3.2使用 Number.isNaN()

2.双等号和三等号为什么返回false

3.拓展——NaN和Null的区别

3.1类型差异

3.2含义差异

3.3相等性

3.4检测方法


首先我们从NaN的定义开始。如果有需要,可以直接从第二大点开始看。

1.什么是NaN?

1.1定义

在JavaScript中,NaN 是一个特殊的浮点数值,表示一个未定义或不可表示的结果。例如,当一个数学运算无法产生有效结果时,就会返回 NaN。

<script type = "text/javascript">console.log(0 / 0);console.log('foo' * 2);
</script>

1.2特点

1.2.1不等于任何值

包括自身在内,NaN 不等于任何值,即 NaN !== NaN

1.2.2不可比较性

NaN 不能与其他数值进行比较,即 NaN < 5NaN > 5 都会返回 false

1.2.3类型为number

尽管NaN表示“不是一个数”,但实际上它的类型仍然是number

1.3如何判断NaN

1.3.1使用isNaN()

isNaN() 函数可以用来检测一个值是否为 NaN。需要注意的是,isNaN() 会先尝试将其参数转换为一个数字,然后判断转换后的值是否为 NaN。

<script type = "text/javascript">console.log(isNaN(NaN));  // trueconsole.log(isNaN('NaN'));  // false, 因为 'NaN' 被转换成了 number 型console.log(isNaN('123abc'));  // true, 因为 '123abc' 被转换成了 NaN
</script>

1.3.2使用 Number.isNaN()

从ES6(ECMAScript 2015)开始,推荐使用 Number.isNaN() 函数。这个函数只接受一个 number 类型的参数,并且不会进行类型转换。

<script type = "text/javascript">console.log(Number.isNaN(NaN));  // trueconsole.log(Number.isNaN('NaN'));  // false, 因为 'NaN' 不是 number 类型console.log(Number.isNaN(123));  // false
</script>

​​​​​​​


那么对于==和===,为什么会返回false呢?

2.双等号和三等号为什么返回false

在JavaScript中,使用双等号 (==) 进行比较时,会进行类型转换,使两边的值能够进行比较。然而,对于 NaN,即使使用双等号 (==) 进行比较,结果仍然是 false。

这是基于IEEE 754浮点数标准的规定,该标准规定 NaN 与任何值都不相等,包括 NaN 自身。这种设计是为了确保在处理数学运算的不确定结果时,可以有一种明确的方式来识别这种不确定性。

同样的,根据ECMAScript规范,NaN 与任何值都不相等,包括自身。这意味着即使是使用全等比较 (===),NaN 也不会等于 NaN。这是因为 NaN 的定义就是“不是一个数”,因此即使两个表达式都产生了 NaN,它们也被认为是不相等的。

3.拓展——NaN和Null的区别

NaN 是一个特殊的数值,代表“不是一个数”(Not-a-Number)。它通常是在数学运算无法得出有意义的结果时产生的。

null 是一个基本类型的值,表示没有任何对象值。它常用来表示一个变量尚未被赋值的情况,或者说它没有指向任何对象。

他们在以下四个方面区别较大:

3.1类型差异

NaN 是一个 Number 类型的值。而null 是一个基本类型的值,尽管 typeof null 返回 'object'。

3.2含义差异

NaN 表示一个数学上的未定义或非法结果。而null 用来表示一个变量没有指向任何对象或值。

3.3相等性

NaN 与任何值都不相等,包括自身。即 NaN !== NaN。但是null 与自身相等,即 null === null。

3.4检测方法

NaN 可以通过 isNaN() 或 Number.isNaN() 来检测。null 可以直接通过 === null 来检测。


作者:CSDN-PleaSure乐事

希望我的博客对您有帮助,也希望在对您有帮助时您可以为我留下点赞收藏与关注,这对我真的很重要,谢谢!

这篇关于在JavaScript当中,为什么NaN===NaN和NaN==NaN返回false?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143815

相关文章

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原