Javascript中null、NaN、undefined区别(JS空值、Javascript空值)(?.链操作符)

文章目录

    • 概述
    • null的本质
    • undefined的两面性
      • 系统层面的undefined
      • 开发者层面的undefined
    • NaN的特殊性
      • 数值运算的异常标识
      • NaN的独特比较行为
    • 深入比较
      • 类型比较
      • 相等性比较
    • 实践建议
      • 变量初始化
      • 错误检测
      • 属性检查(链操作符)
    • 性能考虑

概述

JavaScript中的nullundefinedNaN代表了不同类型的"空"或"无效"状态,理解它们的区别对于编写健壮的代码至关重要。

null的本质

null代表一个空对象指针,是一个有意的空值。这个值的特殊之处在于其类型检查结果:

const obj = null;
console.log(typeof obj); // "object"

这个结果源于JavaScript的历史遗留问题 - 在最初的JavaScript实现中,values were represented as a type tag and a value, with the type tag for objects being 0。

undefined的两面性

系统层面的undefined

当一个变量被声明但未被初始化时,会得到undefined

let unassigned;
console.log(unassigned); // undefinedfunction fn() {// 没有返回值的函数隐式返回undefined
}
console.log(fn()); // undefined

开发者层面的undefined

对象中访问不存在的属性会返回undefined

const obj = {name: 'example'};
console.log(obj.age); // undefined

NaN的特殊性

数值运算的异常标识

NaN产生于无效的数学运算:

console.log(Math.sqrt(-1)); // NaN
console.log(0/0); // NaN

NaN的独特比较行为

NaN是JavaScript中唯一一个不等于自身的值:

console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); // true

深入比较

类型比较

console.log(typeof null);      // "object"
console.log(typeof undefined); // "undefined"
console.log(typeof NaN);       // "number"

相等性比较

// 宽松相等
console.log(null == undefined); // true
console.log(null == 0);        // false
console.log(undefined == 0);    // false// 严格相等
console.log(null === undefined); // false

实践建议

变量初始化

初始化对象类型变量时,建议使用null

let userProfile = null; // 表明这里将来会是一个对象

错误检测

检测无效数值运算时,使用专门的方法:

// 不推荐
if (result === NaN) // 永远为false// 推荐
if (Number.isNaN(result))

属性检查(链操作符)

检查对象属性时,使用可选链操作符:

const user = {};
// 旧方式
console.log(user && user.address && user.address.street);
// 现代方式
console.log(user?.address?.street); // undefined

性能考虑

在条件判断中,直接使用nullundefined作为条件会被转换为false,而不需要额外的类型转换,这在性能上是有优势的。然而,NaN的检测需要特殊处理,可能带来轻微的性能开销。

通过深入理解这些特殊值的行为和使用场景,可以编写出更加健壮和可维护的JavaScript代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 运行时常量池笔记(详细版

📚 Java 运行时常量池笔记(详细版) Java 的运行时常量池(Runtime Constant Pool)是 JVM 方法区的一部分,用于存储编译期生成的字面量和符号引用。它是 Java 类文件常量池的运行时表示,具有动态…

STM32 HAL库USART串口中断编程:演示数据丢失

目录 一、开发环境 二、配置STM32CubeMX 三、代码实现与部署 四、运行结果: ​五、注意事项 上面讨论过,HAL_UART_Receive最容易丢数据了,可以考虑用中断来实现,但是HAL_UART_Receive_IT还不能直接用,容易数据丢失,实际工作中不会这样用,本文介绍STM32F103 HAL库函数…

Javascript网页设计案例:通过PDF.js实现一款PDF阅读器,包括预览、页面旋转、页面切换、放大缩小、黑夜模式等功能

前言 目前功能包括: 切换到首页。切换到尾页。上一页。下一页。添加标签。标签管理页面旋转页面随意拖动双击后还原位置 其实按照自己的预期来说,有很多功能还没有开发完,配色也没有全都搞完,先发出来吧,后期有需要…

缺陷检测之图片标注工具--labme

一、labelme简介 Labelme是开源的图像标注工具,常用做检测,分割和分类任务的图像标注。 它的功能很多,包括: 对图像进行多边形,矩形,圆形,多段线,线段,点形式的标注&a…

Kafka集群,常见MQ面试问题

Kafka 名词介绍 Topic: 消息队列,生产者和消费者面向的都是一个TopicBroker: 一个Kafka服务器就是一个Broker,一个集群由多个Broker组成。一个Broker可以容纳多个TopicProducer: 消息生产者,向Kafka Broker发生消息的客户端Consumer: 消息消…

Unity DeepSeek API 聊天接入教程(0基础教学)

Unity DeepSeek API 聊天接入教程(0基础教学) 1.DeepSeek 介绍 DeepSeek是杭州深度求索人工智能基础技术研究有限公司推出的一款大语言模型。2025年1月20日,DeepSeek-R1正式上线,和当前市面上的主流AI相比,它在仅有极少标注数据的情况下&am…

DeepSeek-R1 蒸馏 Qwen 和 Llama 架构 企业级RAG知识库

“DeepSeek-R1的输出,蒸馏了6个小模型”意思是利用DeepSeek-R1这个大模型的输出结果,通过知识蒸馏技术训练出6个参数规模较小的模型,以下是具体解释: - **知识蒸馏技术原理**:知识蒸馏是一种模型压缩技术,核…

el-input无法输入0.0001的小数,自动转换为0在vue3中的bug

今天遇到个bug&#xff0c;el-input中只能输入0.1或者输入0.1再加上00成为0.001&#xff0c;不能直接输入0.001&#xff0c;否则自动转换为0。需要去掉 v-model.number后面的 .number 源代码&#xff1a; <el-table-column label"实发数量" width"120"…

Spring事务原理 一

Spring事务管理有 声明式事务 和 编程式事务 两种方式&#xff0c;实现对数据库操作的ACID控制。其核心思想是将事务管理与业务逻辑解耦&#xff0c;开发者通过简单注解或配置即可管理复杂事务。 开启Spring事务&#xff0c;本质上就是在Spring容器中增加了一个Advisor&#x…

一周学会Flask3 Python Web开发-Debug模式开启

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 默认情况&#xff0c;项目开发是普通模式&#xff0c;也就是你修改了代码&#xff0c;必须重启项目&#xff0c;新代码才生效&…

使用EasyExcel和多线程实现高效数据导出

​ 使用EasyExcel和多线程实现高效数据导出 1. 概述 在企业级应用中&#xff0c;数据导出是一个常见的需求。为了提高导出效率&#xff0c;尤其是在处理大量数据时&#xff0c;我们可以结合使用EasyExcel库和多线程技术。本文将详细介绍如何通过EasyExcel和多线程技术实现高…

[qt5学习笔记]Application Example示例程序源码解析

开发环境问题 vs2022下直接打开ui、ts文件失败 解决办法如下图&#xff0c; 设置designer独立运行。估计是嵌入运行存在些许bug。 同理&#xff0c;ts编辑工具linguist也存在这个问题。 qrc rc的编辑嵌入编辑都正常&#xff0c;但分离式更稳定可靠。 qt creator编译失败 原…

Jetson Agx Orin平台JP6.0-r36.3版本修复了vi模式下的原始图像损坏(线条伪影)

1.问题描述 这是JP-6.0 GA/ l4t-r36.3.0的一个已知问题 通过vi模式捕获的图像会导致异常线条 参考下面的快照来演示这些线伪影 这个问题只能通过VI模式进行修复,不应该通过LibArgus看到。 此外,这是由于内存问题。 由于upstream已经将属性名称更改为“dma-noncoherent”…

[创业之路-299]:图解金融体系结构

一、金融体系结构 1.1 概述 金融体系结构是一个国家以行政的、法律的形式和运用经济规律确定的金融系统结构&#xff0c;以及构成这个系统的各种类型的银行和非银行金融机构的职能作用和相互关系。以下是对金融体系结构的详细分析&#xff1a; 1、金融体系的构成要素 现代金…

0基础学LabVIEW

对于零基础的朋友来说&#xff0c;学习LabVIEW需要一个科学的学习路径和方法。通过观看优质的B站教程打好基础&#xff0c;再结合实际项目进行实践操作&#xff0c;能够快速提升LabVIEW的应用能力。以下是从入门到进阶的学习建议。 ​ 一、利用B站入门教程打基础 筛选优质教程…

Query String 传递 json 对象参数、map参数

?params[name]John&params[age]30&params[isStudent]true params[name] 和 params[age] 中的 [] 是非法字符。 服务器&#xff08;Apache Tomcat&#xff09;默认不允许在 URL 中使用 []。 对 [] 进行 URL 编码 将 [] 编码为 %5B 和 %5D。 示例&#xff1a; ?pa…

腿足机器人之六- 前向运动学

腿足机器人之六- 前向运动学 刚体运动学基础坐标系定义旋转矩阵与欧拉角齐次变换矩阵&#xff08;平移旋转的统一表示&#xff09; 运动链建模串联运动链结构&#xff08;从基座到末端的关节连接&#xff09;标准Denavit-Hartenberg&#xff08;D-H&#xff09;参数法改进D-H参…

正则表达式(Regular expresssion)

正则表达式 匹配单次 . &#xff1a;匹配任意一个字符 [ ] &#xff1a;匹配[ ]里举例的任意一个字符 /d &#xff1a;匹配数字0-9 /D &#xff1a;匹配非数字 /s &#xff1a;匹配空白或tab建 /S &#xff1a;匹配非空白 /w &#xff1a;…

DarkLabel 2.4使用指南:高效标注视频数据目标检测标签

工具概述 DarkLabel 2.4 是一款强大的多功能标注工具&#xff0c;专为计算机视觉开发者设计&#xff0c;旨在提升标注工作的效率和精确度。其智能标注引擎支持两项核心功能&#xff1a;线性插值标注与多目标跟踪&#xff0c;极大地优化了视频标注过程。 &#xff08;1&#x…

rabbitmq五种模式的总结——附java-se实现(详细)

rabbitmq五种模式的总结 完整项目地址&#xff1a;https://github.com/9lucifer/rabbitmq4j-learning 一、简单模式 &#xff08;一&#xff09;简单模式概述 RabbitMQ 的简单模式是最基础的消息队列模式&#xff0c;包含以下两个角色&#xff1a; 生产者&#xff1a;负责发…