如何区分 null 和 undefined?
解释 JavaScript 中 null 和 undefined 的区别,并举例说明它们在不同情况下的行为和使用场景。
null 和 undefined 都表示“空值”,但关键差异体现在含义、类型和行为上,以下是主要区别:
- 核心定义差异
- undefined:表示变量未初始化或未定义值,是 JavaScript 赋予的默认状态。典型场景包括:
- 变量声明后未赋值(如
let a; console.log(a)
输出undefined
)。 - 访问对象不存在的属性。
- 函数未提供实参的形参或没有显式返回值。
- 变量声明后未赋值(如
- null:表示一个变量被显式设置为空对象引用(人为定义的 “nothing”),用于清空值或释放内存。典型场景包括:
- 初始化对象为空引用(如
let user = null
)。 - 作为函数参数表示无有效对象输入或对象生命周期结束时的回收。
- 初始化对象为空引用(如
- undefined:表示变量未初始化或未定义值,是 JavaScript 赋予的默认状态。典型场景包括:
- 类型检查与操作行为差异
typeof
检测结果:typeof undefined
返回"undefined"
。typeof null
异常返回"object"
,这是 JavaScript 早期设计遗留问题(二进制机制误判),非实际对象类型。
- 宽松相等 (
==
) 与严格相等 (===
):null == undefined
为true
(抽象比较时类型自动转换)。null === undefined
为false
(二者类型不同:Null 和 Undefined)。
- 数值转换行为:
Number(null)
结果为0
(可作为数字计算)。Number(undefined)
结果为NaN
(非数字值,计算时报错)。console.log(10 + null); // 10(null→0) console.log(10 + undefined); // NaN(undefined→NaN)
- 语义和编码实践
- 编程中应避免混淆:
- 使用
===
严格相等区分二者(例:if (value === null)
检测设空值)。 - 用
undefined
表示“未定义状态”(自然存在),null
表示“未定义状态”(需显式赋值)。
- 使用
- 二者均为 falsy 值:在布尔上下文(如
if (value)
)中均转为false
。
- 编程中应避免混淆:
- 用法原则总结
- 优先用
undefined
保持语言默认行为(例:函数未返回时为自动结果)。 - 在需要控制资源释放(如清空对象引用以触发垃圾回收)时,显式赋值
null
。
- 优先用