不知道大家有没有试着去打印一下unll和undefined相等‘==’和全等‘===’的结果。结果可能会让一些人疑惑: null==undefined //true ; null===undefined // false 。为什么会是那样的结果呢?这就得深入去了解两者的使用场景以及自身的一些性质。这样才能更加深刻地理解null和undefined。下面的内容可能会对你理解null和undefined有一定程度的帮助,这将有助于你以后在什么时候会使用它们。
Number转换的值不同,Number(null)输出为0, Number(undefined)输出为NaN;
null表示一个值被定义了,但是这个值是空值
应用场景为以下几个方面:
①作为函数的参数,表示函数的参数不是对象
②作为对象原型链的终点 (Object.getPrototypeOf(Object.prototype //null))
③定义一个值为null是合理的,但定义为undefined不合理(var name = null)
undefined表示缺少值,即此处应该有值,但是还没有定义
应用场景为以下几个方面:
①变量被声明了还没有赋值,就为undefined
②调用函数时应该提供的参数还没有提供,该参数就等于undefined
③对象没有赋值的属性,该属性的值就等于undefined
④函数没有返回值,默认返回undefined
所以, ECMAScript 规范认为,既然 null 和 undefined 的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也具有相似性,即有
undefined == null; //true
但 === 会返回 false ,因为全等操作 === 在比较相等性的时候,不会主动转换分项的数据类型,而两者又不属于同一种类型:
undefined === null; //false,类型不相同
undefined !== null; //true, 类型不相同
用一句话总结两者的区别就是:undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态。所以,在实际使用过程中,为了保证变量所代表的语义,不要对一个变量显式的赋值 undefined,当需要释放一个对象时,直接赋值为 null 即可。
下面来看一道例题来巩固对null和undefined的区别:
let a ={ b:undefined, c:null};
let {b=2,c=3,d=0}= a;
console.log(b,c,d)
大家千万不要觉得答案是2,3,0.其实如果理解上面的内容,这里的答案就非常明显了。
console.log(b,c,d) // 2 null 0
利用对象解构,让{b=2,c=3,d=0}和a对象匹对。因为对象a中,b是undefined就意味着这里是有值,但还没赋值。此时b=2就能把对象a中的b解构为2;而c是一个null即这里是有值的但定义为空而已,对象解构是a中的c就是有null这样一个值,此时,左边的c=3,重解构是不起效果的,所以c还是null。