句简单来说是:undefined代表了不存在的值,null代表了没有值。也就是,比如对一个值声明后,没有赋值,输出他就是undefined,是不存在的,而当赋值为null,那么输出就是
null。这两者还有一些区别点要注意:

1
2
3
4
5
6
7
8
9
//1
undefined == null//true,这里相等是因为“==”对他们做了转换
undefined === null //false
//undefined的值是nulL派生来的,所以他们表面上是相等的
//2
let a;
typeof a;//undefined
let b=null;
typeof b;//object

这里为什么typeof b输出为Object呢?
null不是一个对象,尽管ypeof age输出的是Object,逻辑上讲,null值表示一个空对象指针,这是一个历史遗留
问题,JS的最初版本中使用的是32位系统,为了性能考虑使用低位存储变量的类型信息,000开头代表是对象,
null表示为全零,所以将它错误的判断为Object。

1
2
if(!undefined) console.log("undefined is false");// undefined is false
if(!null) console.log("null is false");// null is false
1
2
3
4
5
6
7
8
//对于nu11
let nullValue = null;
let nullToNumber = Number(nullValue);
console.log(nullToNumber);//输出:0
//对于undefined
let undefinedValue;
let undefinedToNumber = Number(undefinedValue);
console.log(undefinedToNumber);//输出:NaN

null可以被转为数字0. undefined不可以转为数字

1
2
Object.getPrototypeof(Object.prototype);
// null

项目实践中的区别

null表示”没有对象”,即该处不应该有值。典型用法是:
(1)作为函数的参数,表示该函数的参数不是对象。
(2)作为对象原型链的终点。
undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2)调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。.
(4)函数没有返回值时,默认返回undefined。