一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

null 和 undefined 究竟有什么区别 何时该用哪一个

时间:2026-06-20 10:47:52 编辑:袖梨 来源:一聚教程网

undefined 表示“未初始化”,是引擎自动赋予的默认值;null 表示“主动清空”,是开发者明确赋的空值。二者语义、来源、用法、类型及比较行为均不同,开发中应按意图区分使用。

简单说:undefined 是“还没给值”,null 是“我主动清空了”。它们语义不同、来源不同、用法也不同。

它们的来源和含义不一样

undefined 是 JavaScript 引擎自动给的默认状态,代表“未初始化”或“不存在”:

  • 变量声明了但没赋值,比如 let x;x 就是 undefined
  • 函数没写 return,返回值就是 undefined
  • 访问对象不存在的属性,比如 {name: 'A'}.ageundefined
  • 调用函数时少传参数,对应形参也是 undefined

null 是开发者主动写的,代表“这里本该有值,但我明确让它为空”:

  • 有意释放一个大对象引用,比如 data = null; 帮助垃圾回收
  • 初始化一个将来会存对象的变量,比如 let currentUser = null;
  • 函数找不到结果时,返回 null 表示“没查到”,而不是让调用方猜是不是出错了
  • DOM 查询失败,document.getElementById('xxx') 找不到就返回 null

类型和比较行为要特别注意

typeof undefined 返回 "undefined"typeof null 却返回 "object"——这是历史遗留 bug,但已成规范,别被误导。

比较时:

  • null == undefinedtrue(双等会做类型转换)
  • null === undefinedfalse(严格相等看类型也看值)
  • !null!undefined 都是 true(在 if 判断里都转为 false)
  • Number(null)0Number(undefined)NaN

什么时候该用哪一个?记住这个原则

undefined 的情况,基本都是你“没动它”,系统自动填的:

  • 只声明变量,不打算立刻赋值
  • 函数参数可选,缺省时让它自然为 undefined
  • 判断某个属性是否存在,用 obj.prop === undefined 或更稳妥的 Object.hasOwn(obj, 'prop')

null 的情况,是你“主动干预”,想表达一种明确意图:

  • 显式清空一个对象引用,避免内存泄漏
  • API 返回值中,用 null 表示“查无此物”,而 undefined 更适合表示“字段压根没定义”
  • 初始化状态变量,比如 let selectedItem = null;let selectedItem; 更清晰表明“初始无选择”
  • TypeScript 中,如果你声明类型为 string | null,就明确告诉别人这个值可能是空,不是忘了赋值

实际开发中的小建议

别手动给变量赋 undefined,这容易让人困惑——它本该是“系统默认”,你一写反而像 bug。真要清空,就用 null

判断是否“空”时,优先用严格相等:

  • 检查是否未赋值:value === undefined
  • 检查是否被设为空:value === null
  • 如果两者都算“空”,用 value == null(等价于 value === null || value === undefined),简洁且安全

现代 JS 和 TypeScript 越来越倾向把 null 当作可控的空状态,把 undefined 留给系统行为——这样代码意图更干净,协作也更省心。

热门栏目