历史背景
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 不包括错误处理机制时更易于维护