jstips 05:JavaScript 中 undefined 与 null 的本质区别与正确判定
教程【免费下载链接】jstipsThis is about useful JS tips!项目地址https://gitcode.com/gh_mirrors/js/jstips点击查看免费下载undefined与null是 JavaScript 中最常被混淆的两种空值但它们语义完全不同undefined是引擎默认的未初始化状态null是程序员显式写入的无值标记。本文以 jstips 第 05 期为基础系统梳理二者的定义差异、typeof结果、falsy 判定、JSON 序列化行为与检测写法并结合仓库内相关技巧严格相等、布尔转换、声明基础等给出可直接落地的实践方案读完你将能在日常编码与面试中准确区分并可靠判定这两种值。语义原点两种空的本质区别原文档给出的核心定义可以浓缩为两句话undefined一个变量没有被声明或者被声明了但还没有被赋值时它的值就是undefined。它是 JavaScript 引擎主动产生的一种状态。null它是一个赋值值assignment value含义是没有值。它不会被引擎自动产生而是由程序员主动写入用来表示这个变量当前故意不持有任何对象。由此引申出两个关键事实JavaScript 会把未赋值的变量默认设置为undefined例如var x;之后x的值即为undefined。JavaScript 引擎从来不会自动把某个变量设置为null。null只出现在程序员的显式赋值中例如var el null;表示此时还没有元素对象。这个自动产生 vs 手动写入的区分是理解二者的第一把钥匙。undefined通常意味着意外缺失而null通常意味着刻意留空。在引擎行为层面产生undefined的场景远不止声明未赋值常见情形还包括function noReturn() {} noReturn(); // undefined没有 return 的函数返回 undefined var arr [1, 2, 3]; arr[10]; // undefined越界访问 var { a } {}; // undefined解构目标不存在 void 0; // undefinedvoid 运算符保证返回 undefined相比之下null通常由你主动写出例如清空某个引用、表示查询无结果的哨兵值等。从仓库姊妹篇 Basics: Declarations 中可以看到当声明var x, y 3时x的打印结果正是undefined——这从声明层面印证了未赋值变量默认值为 undefined的规则。typeof 的差异与 typeof null 的历史包袱原文档指出undefined的typeof结果是字符串undefinednull的typeof结果是字符串object。typeof undefined; // undefined typeof null; // objecttypeof null返回object是一个广为人知的历史遗留问题根据 ECMAScript 早期规范的设计值在内部用类型标签type tag表示而null的类型标签被编码为 0恰好与对象类型共用了标签位于是typeof一直将null报告为object。这个行为从未被修正修正会破坏存量代码因此你应当把它当作既定事实来记忆而不是用它来判定值是否为null——永远不要用typeof x object来判断x是否为null。需要注意的是尽管typeof null objectnull本身依然是原始类型primitive这一点原文档明确强调二者都属于基本类型而不是对象。原始类型与 falsy 判定原文档强调了两点共性二者都是原始类型primitives二者都是 falsy即强制转布尔后均为falseBoolean(undefined); // false Boolean(null); // false这个特性在日常条件判断中很常见例如if (x)会同时排除undefined、null、0、、NaN等所有 falsy 值。若想拿到无论如何都是布尔的结果可以参考仓库第 30 期 Converting truthy/falsy values to boolean 中的!!技巧!!undefined; // false !!null; // false !!0; // false !!; // false !!hello; // true借助Boolean()或!!你可以把任何值归一化为布尔从而安全地参与逻辑运算。JSON 序列化中的不对称性原文档指出undefined在 JSON 中不是合法值而null是。这与 JSON 规范直接相关——JSON 只有null字面量没有undefined字面量。在JSON.stringify的实践中这个差异会体现在三类场景中JSON.stringify({ a: undefined, b: 1 }); // {b:1} 对象中值为 undefined 的属性会被整体省略 JSON.stringify([undefined, 1]); // [null,1] 数组中的 undefined 会被替换成 null JSON.stringify(undefined); // undefined 顶层直接序列化 undefined 会返回 undefined即没有输出换句话说序列化时undefined要么被丢弃、要么被降级为null而null始终能原样保留。需要精细控制序列化字段时可参考仓库第 40 期 Using JSON.Stringify 介绍的第二个参数属性白名单或过滤函数与第三个参数缩进格式化。可靠的检测方式原文档给出了两条最可靠的判定写法// 判断变量是否为 undefined typeof variable undefined; // 判断变量是否为 null variable null;为什么这样写是可靠的typeof variable undefinedtypeof对未声明的变量也不会抛出ReferenceError而是直接返回undefined因此它既能检测已声明未赋值也能检测完全未声明的情况是最安全的 undefined 探测方式。variable nullnull只有唯一值与严格相等运算符配合即可精确判定不会误伤undefined。尤其要警惕两种错误写法// 错误typeof 无法区分 null 与 object typeof value object // null 也会返回 true误判 // 错误宽松相等会同时命中 null 和 undefined value null // 同时为 truevalue 是 null 或 undefined 时都成立其中value null虽然能一次判断两者但它是利用宽松相等的隐式转换特性语义模糊容易掩盖 bug不建议作为常规判定手段。相等性 与 的不同结论原文档最后给出了一个最容易踩坑的事实null undefined; // true null undefined; // false宽松相等在比较null与undefined时抽象相等算法规定二者相互相等且只与对方相等因此null undefined为true。严格相等不进行任何隐式转换null与undefined是两种不同的原始类型、不同的值因此null undefined为false。这正是仓库第 24 期 Use instead of 所强调的核心在必要时会执行自动类型转换而同时比较值与类型行为更可预测。判定 null/undefined 这类语义敏感的值时应一律使用或!避免宽松相等引入意外分支。声明场景中的实践undefined 是默认值undefined作为引擎默认值的特性在变量声明链中体现得尤为明显。仓库 Basics: Declarations 提供了可运行的示例;(() { var x, y 3; // 等价于 var x; var y 3; console.log(x, y); // undefined, 3 —— x 未赋值被引擎置为 undefined })();在函数内部这样声明时x的默认值就是undefined而一旦你希望显式表示无值则应当写出var x null;。这一区分在编写库函数、设计 API 返回值时尤其重要没有传参/没有返回值交给undefined调用方主动清空/表示空引用交给null能让代码意图更清晰。常见误区速查误区后果正确做法用typeof x object判断x是否为 nullnull会被误判为对象用x null用x null代替严格判断null与undefined被混为一谈掩盖真实语义明确区分后用判定认为undefined能写入 JSON序列化时属性被省略或被降级为null需要空值时显式用null混淆空字符串、0与null/undefined条件判断把所有 falsy 值一视同仁丢失信息先判断类型再判断 falsy把null当作引擎产生的状态误解未初始化与显式清空的语义记住 null 只来自程序员赋值结语与仓库延伸阅读undefined是引擎的未初始化信号null是程序员的显式无值标记前者在 JSON 中不合法、typeof结果为undefined后者在 JSON 中合法、typeof结果为object历史遗留两者都是原始类型、都是 falsy且只有宽松相等才把二者视为相等。记住这五组差异加上typeof x undefined与x null两条判定写法就足以在绝大多数场景中正确处理这两种空值。想要继续深入相关主题可以结合仓库内的这些配套技巧阅读Use instead of 严格相等、Converting truthy/falsy values to boolean布尔归一、Basics: Declarations声明与默认值、Using JSON.Stringify序列化细节以及本仓库的投稿格式 POST_TEMPLATE.md 与投稿流程 CONTRIBUTING.md。赞分享教程【免费下载链接】jstipsThis is about useful JS tips!项目地址https://gitcode.com/gh_mirrors/js/jstips点击查看免费下载相关推荐dbskill 商业诊断 AI Skills 工具箱指南安装、动态路由与 29 个 Skill 全解析dbskill 商业诊断 AI Skills 工具箱指南安装、动态路由与 29 个 Skill 全解析 本文以 README.ko.md https://li教程30 seconds of code彻底理解 JavaScript 中 undeclared、undefined 与 null 的区别30 seconds of code彻底理解 JavaScript 中 undeclared、undefined 与 null 的区别 导读 JavaScri教程文档30 Seconds of CodeJavaScript Promise 中 then 与 finally 的本质区别与正确用法30 Seconds of CodeJavaScript Promise 中 then 与 finally 的本质区别与正确用法 Promise.protot教程文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

全景解读 CPF-Cordova 与 CPF-Ionic:鸿蒙混合开发双生态的组织、治理与协作模式

全景解读 CPF-Cordova 与 CPF-Ionic:鸿蒙混合开发双生态的组织、治理与协作模式

全景解读 CPF-Cordova 与 CPF-Ionic:鸿蒙混合开发双生态的组织、治理与协作模式 本文回到组织本身—— 解读 CPF-Cordova 与 CPF-Ionic 两个组织的定位来源(SIG 治理结构)、仓库版图、贡献路径与生态位,并回答一个战略问题&#x…

2026/10/11 16:20:32 阅读更多 →
高频变压器选型设计规范

高频变压器选型设计规范

前言文档版本:V1.0编制目的:规范高频变压器选型、电路设计、降额设计、PCB/结构布局及可靠性验证,用于反激、正激等开关电源实现电压变换与电气隔离,规避磁芯饱和、绕组过热、绝缘击穿、匝间短路、安规失效等风险。适用范围&#…

2026/10/10 17:35:42 阅读更多 →
RCO如何在尺寸预算下精准分配精度?Qwen3.8-Flash-Next-GSQ-RCO-GGUF黎曼优化搜索原理

RCO如何在尺寸预算下精准分配精度?Qwen3.8-Flash-Next-GSQ-RCO-GGUF黎曼优化搜索原理

RCO如何在尺寸预算下精准分配精度?Qwen3.8-Flash-Next-GSQ-RCO-GGUF黎曼优化搜索原理 【免费下载链接】Qwen3.8-Flash-Next-GSQ-RCO-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF 这个项目为 512 专家 M…

2026/10/10 17:44:21 阅读更多 →

最新新闻

Intouch 加数据库做 Excel 报表:从 SQLConnect 到 VBA 的完整数据链路

Intouch 加数据库做 Excel 报表:从 SQLConnect 到 VBA 的完整数据链路

简介:这份文档面向SCADA系统工程师与Intouch组态开发人员,聚焦WonderWare Intouch 2014R2平台与SQL Server 2012数据库的集成及Excel报表实现,适合需要搭建实时数据存储与报表展示方案的中级技术人员参考。资源包内共1个doc文件,约…

2026/10/11 16:19:34 阅读更多 →
杭州永耀环境工程有限公司:水地暖安装服务商靠谱商家测评排名

杭州永耀环境工程有限公司:水地暖安装服务商靠谱商家测评排名

水地暖安装前的行业认知:从原理到适用范围 水地暖的本质与核心构成 水地暖是以热水为热媒,通过埋设于地面填充层内的盘管循环散热,实现由下至上均匀加热的一种采暖方式。一套完整的水地暖系统通常包含热源设备(壁挂炉、空气源热泵等)、分集水…

2026/10/11 16:19:34 阅读更多 →
RHEL 7.6 上 Oracle 19C + ASM + DataGuard 部署实战与避坑指南

RHEL 7.6 上 Oracle 19C + ASM + DataGuard 部署实战与避坑指南

简介:本资源是一份面向数据库运维工程师与DBA的实战安装指南,聚焦在RHEL 7.6环境下部署Oracle 19C并配合ASM存储与DataGuard容灾架构,适合具备一定Linux与Oracle基础、希望搭建高可用数据库环境的中高级技术人员参考。压缩包内仅含1个PDF文档…

2026/10/11 16:19:34 阅读更多 →
Java图书管理系统源码解析:Swing+MySQL+JDBC三层架构实战

Java图书管理系统源码解析:Swing+MySQL+JDBC三层架构实战

简介:Java编写的图书管理系统,面向Java初学者与有意巩固开发流程的学习者,完整覆盖图书信息增删改、用户管理、借阅归还、条件查询与借阅统计等核心功能。项目涉及Swing图形界面、集合框架、JDBC数据库连接及MVC分层思想,帮助理解…

2026/10/11 16:19:34 阅读更多 →
电路描述语言CDL语法详解与编译器实现:从C17基准电路到网表解析

电路描述语言CDL语法详解与编译器实现:从C17基准电路到网表解析

简介:电路描述语言(CDL)是一种用于描述电路结构、连接关系与逻辑功能的专用编程语言,在数字电路测试与仿真场景中常用于结构化建模。这份PPT讲解材料以C17电路为主线,系统梳理CDL的语法规则:描述语句分为函…

2026/10/11 16:19:34 阅读更多 →
答辩PPT模板高效填充指南:从占位符到完整演示的避坑与调优

答辩PPT模板高效填充指南:从占位符到完整演示的避坑与调优

简介:面向福州大学本科生及研究生毕业答辩场景的论文答辩PPT模板,围绕绪论、研究过程、作品展示、总结四大模块组织内容;其中绪论部分梳理选题背景、国内外研究现状与选题意义,研究过程部分细化理论基础、研究思路、研究方法、关键…

2026/10/11 16:18:34 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →