前言
一个又一个三四年经验的面试者,当被问到 'null 和undefined'区别时, 大都简单说两句.当我告诉他们答案时,有些面试者不屑的说,这影响编程吗?当然不影响写代码,只是影响优化.大厂和高工资都和你无缘!
一 undefined是什么?
- 和Number,String,Bool一样它是一种数据类型,可以使用typeof进行检测.
let str = '小甜甜';
let age; //声明,未赋值
console.log(typeof str); // string
console.log(typeof age); // undefined
- 声明变量但没有初始化时,就会自动赋特殊值undefined.
let num;
console.log(num == undefined); // true
上面例子中变量num声明未初始化,而在和undefined比较时,两者相等.
- 包含undefined值的变量和和未定义变量是有区别的.但是两个变量都不能进行任何真正的操作.
let num;
console.log(num); //
console.log(typeof mes); // undefined
console.log(mes); // 保存
// 对于未声明的变量,直接输出会报错,但执行typeof则会输出undefined
- 声明变量时,如果能预测下方赋值的类型,最好为其赋同等类型的空置,而不是去使用undefined.
// 如果下文赋值字符串类型,可以给空字符串
let str = '';
// 如果下文是数字,可以提前给0
let num = 0;
// 提前设定好类型,有利于提高js解释器执行效率
- 在if判断中,undefined会转化为false
let mes; // 变量声明了,但是值为undefined
if (mes) {
// 不执行
}
if (!mes) {
// 执行
}
二 null是什么
- null是个特殊值,逻辑上讲nul是个空对象指针.
let info = null;
console.log(typeof info); // object 从测试结果看,null本质上也是个空对象
- 当我们不在使用一个变量时,可以赋值为null,解除占用,下次垃圾回收程序就收回值所占用的空间.
let div = document.querySelectorAll('.goods');
div.forEach(() => {
// ... 处理程序
})
//使用完毕, 赋值为null
div = null;
总结
- 增加undefined的目的就是为了正式明确空对象指针(null)和未初始化变量的区别.
- undefined是自然的一种值,在各种情况下会自动产生. (函数无返回值,访问的属性不存在等).
- null则是需要手动设置的一种值,表示后续要赋值为空对象.或者说要解除引用.
- 两者都是无效值,都转化为booll值false.