JavaScript中undefined与null的区别及历史渊源
本文深入解析JavaScript中undefined与null的区别。两者在布尔转换和相等性判断上表现相似,但语义不同:null表示“没有对象”,undefined表示“缺失值”。文章追溯了Brendan Eich设计这两个值的初衷,从null作为对象转为0,到undefined作为原始值转为NaN的历史演变,帮助开发者理解其底层逻辑与最佳实践。
JavaScript中undefined与null的相似性
在大多数计算机语言中,通常只有一个表示“无”的值,例如C语言的NULL、Java语言的null、Python语言的None以及Ruby语言的nil。
值得注意的是,JavaScript语言中竟然存在两个表示“无”的值:undefined和null。这背后的原因值得探究。
一、相似性
在JavaScript中,将变量分别赋值为undefined或null,从实际操作效果来看,两者几乎没有区别。
var a = undefined;
var a = null;
上述代码展示了a变量分别被赋值为undefined和null的情况,这两种写法在大多数场景下几乎等价。此外,在if语句中,undefined和null都会被自动转换为false,甚至相等运算符(==)也会直接判定两者相等。
if (!undefined)
console.log('undefined is false');
// undefined is false
if (!null)
console.log('null is false');
// null is false
undefined == null
// true
由此可见,undefined和null在行为表现上具有极高的相似性。
既然undefined和null的含义与用法如此接近,为何要同时保留这两个值?这似乎增加了JavaScript的复杂度,容易让初学者感到困惑。例如,Google开发的JavaScript替代语言Dart就明确规定只有null,而不存在undefined。
undefined与null的历史渊源
二、历史原因
在阅读《Speaking JavaScript》一书时,我意外找到了这个问题的答案。这与JavaScript的历史发展密切相关。1995年JavaScript诞生之初,借鉴了Java的设计,仅设置了null作为表示“无”的值。根据C语言的传统,null被设计为可以自动转换为数值0。
Number(null)
// 0
5 + null
// 5
然而,JavaScript的设计者Brendan Eich认为仅保留null还不够,主要基于以下两个原因。
首先,null在Java中被视为一个对象。但JavaScript的数据类型分为原始类型(primitive)和合成类型(complex)两大类,Brendan Eich认为表示“无”的值不应是对象。
其次,JavaScript的初始版本缺乏完善的错误处理机制,当发生数据类型不匹配时,往往会自动转换类型或静默失败。Brendan Eich认为,如果null自动转换为0,将很难发现此类错误。
因此,Brendan Eich设计了另一个值:undefined。
JavaScript最初的设计区分
三、最初设计
在JavaScript的初始版本中,两者的区分如下:null是一个表示“无”的对象,转换为数值时为0;而undefined是一个表示“无”的原始值,转换为数值时为NaN。
Number(undefined)
// NaN
5 + undefined
// NaN
当前null与undefined的实际用法
四、目前的用法
然而,上述严格区分在实践中很快被证明不可行。目前,null和undefined基本同义,仅存在细微差别。null表示“没有对象”,即该处不应有值。其典型用法包括:(1)作为函数参数,表示该参数不是对象;(2)作为对象原型链的终点。
Object.getPrototypeOf(Object.prototype)
// null
undefined表示“缺少值”,即此处应该有一个值,但尚未定义。其典型用法包括:
(1)变量已声明但未赋值时,其值等于undefined;(2)调用函数时,未提供应有的参数,该参数等于undefined;(3)对象中未赋值的属性,其值为undefined;(4)函数没有返回值时,默认返回undefined。
var i;
i // undefined
function f(x){console.log(x)}
f() // undefined
var o = new Object();
o.p // undefined
var x = f();
x // undefined
下面进行简要总结
null是JavaScript的关键字,表示非对象。
undefined表示没有值,说明该值不存在或未被初始化。
| 相同点 | 不同点 |
| 自有类型唯一值 | null是对象,undefined是保留字 |
| 没有属性和方法 | null在参与数学运算中转化成0,undefined在数学运算中无法转化或是转化成NaN |
| ==认为相等,===认为不等 | null !==undefined //true |
| 都是假值,在布尔值变量表示值相同 |
null是空对象,undefined是window的属性(但是不是对象属性) |
| alert(typeof null) // object ; alert(typeof undefined) // undefined ; |
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
JS对象数组转字符串为什么推荐用JSON.stringify()
2026-11-05 09:40:31








