历史背景
null
与undefined
都可以表示“没有”,含义非常相似。将一个变量赋值为undefined
或null
,语法效果几乎没区别
在if
语句中,它们都会被自动转为false
,相等运算符(==
)甚至直接报告两者相等
if (!undefined) {
console.log('undefined is false');
}
// undefined is false
if (!null) {
console.log('null is false');
}
// null is false
undefined == null
// true
JavaScript 诞生时,最初像 Java 一样,只设置了null
表示"无"。根据 C 语言的传统,null
可以自动转为0
Number(null) // 0
5 + null // 5
但是null
存在两个问题
-
null
就像在 Java 里一样,被当成一个对象,但是表示“无”的值最好不是对象 - 如果
null
自动转为0
,很不容易发现错误
因此出现了undefined
以便区分,null
是一个表示“空”的对象,转为数值时为0
;undefined
是一个表示"此处无定义"的原始值,转为数值时为NaN
Number(undefined) // NaN
5 + undefined // NaN
null 与 undefined 的用法
-
null
表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入null
,表示该参数为空 -
undefined
表示变量未定义,在函数中若忘记传参数则参数会显示undefined
,表示在传参过程中出现了问题
var a = null;
function f(x) {
return x;
}
console.log(f(a)); // null
console.log(f()); // undefined
总结来说,null
可以在未设置值时起到暂时顶替的作用,就像 Html 中写<a>
标签时先用#
来顶替未设定的超链接,而undefined
则更像是一种警告机制,当结果中出现undefined
的时候,就知道有变量为赋值或函数未传参,就会更便于纠错
个人认为,undefined
的出现就是帮助null
分担纠错任务,防止出现未传入参数之类的问题,在早期 JavaScript 不包括错误处理机制时更易于维护