前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库JavaScript undefined null 区别
JavaScript值与类型

undefined 和 null 到底有什么区别,什么时候该用哪个?

undefined 是「还没有值」,变量没赋值、参数没传、属性不存在时,语言自动给你 undefined。null 是「有意为空」,一般是开发者主动写上去的,表示这里本该有个对象,但现在没有。

前端进阶之旅 · 一题精讲更新于 2026.09.29
JavaScript#值与类型
先看核心答案读代码示例
理解线索

两种「没有值」

  1. undefined声明了没赋值、没传的参数、不存在的属性、函数没写 return
  2. null主动清空、查询不到对象,比如 getElementById 找不到元素
  3. ?? 和 ?.两个都当成「空」处理,是少数对它们一视同仁的语法

默认参数和解构默认值只认 undefined。后端返回 null 时,function f(x = 10) 拿到的就是 null,默认值不会生效。

核心回答

先记住这个答案

两者都表示「没有值」,但来源和意图不同。undefined 是语言自动产生的:变量声明了没赋值、函数参数没传、访问不存在的属性、函数没有 return,拿到的都是 undefined。null 是开发者主动写的,表示「这里应该是个对象,但现在是空的」。表现上的差别主要有四个:typeof null 是 'object' 而 typeof undefined 是 'undefined';null == undefined 为 true 但 === 为 false;转数字时 null 是 0、undefined 是 NaN;默认参数只在值是 undefined 时才生效。

  • undefined 常表示未赋值
  • typeof null 是 object
  • 宽松相等时二者相等
  • 默认参数只在值为 undefined 时生效

把两者放进同一组操作里对比

面试时光背概念不够,最好能说出它们在具体操作里的不同结果。

默认参数、比较、转数字、JSONJavaScript
function greet(name = '游客') {
  return name
}
console.log(greet(undefined), greet(null)) // 只有 undefined 触发默认值
console.log(null == undefined, null === undefined)
console.log(Number(undefined), Number(null))
console.log(JSON.stringify({ a: undefined, b: null }))
console.log(null ?? '空', undefined ?? '空')
查看输出与解释
游客 null
true false
NaN 0
{"b":null}
空 空

第一行最容易踩坑。接口返回 { name: null } 时,解构 const { name = '游客' } = data 拿到的还是 null,拼进模板字符串里就成了「你好,null」。第三行说明 null + 1 是 1,undefined + 1 是 NaN,统计数据时遇到缺失值要特别小心。第四行说明 undefined 字段序列化时会被丢掉,null 会保留,这一点在提交接口时有实际用处。

项目里怎么选

一个简单的约定:自己主动表示「空」时用 null,把 undefined 留给「不存在、没传」这种语言自己产生的状态。这样看到 null 就知道是有人故意清空的,看到 undefined 就知道是没初始化或者字段根本不存在。

提交表单时用 null 表示清空
编辑资料页里,用户把生日清空了。如果前端把字段设成 undefined,JSON.stringify 会把它丢掉,后端收到的请求里没有这个字段,会理解成「不修改」。要让后端清空,必须显式传 null。反过来,不想提交的字段设成 undefined,正好能省掉手动删除。
判空时两个一起处理
大多数业务判断并不关心是哪一种空。value == null 这一个表达式就能同时匹配 null 和 undefined,是少数推荐使用 == 的场合。更常见的写法是 value ?? 默认值 和 obj?.a?.b,它们也同时把两者当成空,但不会像 || 那样把 0 和空字符串也当成空。
回答前,多想一步

容易答错的地方

以为 null 是一种对象
typeof null === 'object' 只是早期实现留下的问题,null 本身是原始值,不能读属性,读了会抛 TypeError。
以为给参数传 null 也能用上默认值
默认参数和解构默认值只在值严格等于 undefined 时触发。后端字段可能返回 null 的话,要用 ?? 兜底,比如 const name = data.name ?? '游客'。
以为 undefined 是关键字
undefined 其实是全局对象上一个只读属性,不是保留字。在函数里 let undefined = 1 是合法的,会把它遮住。这也是很多老库用 void 0 来拿真正 undefined 的原因。
试着用自己的话回答

面试官还会怎么问?

null >= 0 为什么是 true,null == 0 却是 false?

大小比较会把 null 转成数字 0,所以 null >= 0 成立。但 == 对 null 有专门规则:null 只和 null、undefined 相等,不做数字转换,所以 null == 0 是 false。

删除一个对象属性,用 delete 还是赋值 undefined?

delete obj.a 之后属性真的没了,'a' in obj 是 false。赋值 undefined 之后属性还在,'a' in obj 是 true,Object.keys 也能列出来。需要区分「没有这个字段」和「字段为空」时,这个差别很关键。

TypeScript 里 undefined 和 null 怎么区分?

开启 strictNullChecks 后,它们是两种独立的类型。可选属性 name?: string 的类型是 string | undefined,不包含 null。后端可能返回 null 的字段要显式写成 string | null,否则类型和实际数据对不上。

从一道题,走向一组知识

把知识连起来

值与类型

Number.prototype.valueOf 返回什么?自定义对象的 valueOf 会怎样影响类型转换?

Number(null) 是 0、Number(undefined) 是 NaN,这两个转换结果可以接着看数字转换的规则。

值与类型

void 运算符有什么用?为什么老代码里到处是 void 0?

void 0 是拿到真正 undefined 最稳的写法,老代码里经常用它代替 undefined。

参考资料

  • JavaScript:值与类型参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 把两者放进同一组操作里对比
  3. 项目里怎么选
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑