undefined与null与?. ??

undefined:

undefined是全局对象的一个属性,在一下情况下都是undefined:

当一个变量没有被赋值

当一个函数没有返回值

当某个对象不存在某个属性却去访问;

当函数定义了形参但没有传递实参

typeof undefined  判断类型是 'undefined'; undefined == undefined; undefined === undefined;undefined == null;

null:

null代表对象的值未设置,相当于一个对象没有设置指针地址就是null;

typeof null  判断类型是 'object'; null == null;null === null;null == undefined;null !== undefined;

null其实是属于自己的NULL类型,并非‘object’类型,之所以typeof判定为’object‘,是JavaScript数据类型在底层都是以二进制的形式存储的;

二进制的前三位为0 会被typeof判定为’object‘对象类型,而null的二进制位恰好都为0,因此,typeof null 为‘object’

undefined表示一个变量初始状态值,而null则表示一个变量被人为设置为空对象,而不是原始状态;

在实际使用中,无需对一个变量显示的赋值undefined,当需要释放一个对象时或让一个变量为null时,直接赋值为null即可;

对象被赋值为null以后,对象对应的堆内存中的值就是游离状态了,GC会择机回收该值并释放内存。

因此,需要释放某个对象,就将变量设置为null,即表示该对象已经被清空,目前无效状态

?. 可链选操作符 和 ??空值合并操作符(ES11)

?.可链选操作符允许读取链接对象深处的属性值,不必明确验证链中的每个引用是否有效

?.可链选操作符类似 . ,不同之处在于,引用为空的情况下不会引起报错

null?.name   //undefined
null.name     //报错
 
undefined?.name   //undefined
undefined.name     //报错
 
const person = {
  name:'cc',
  prop:{
     age:18
  }
}
person?.name?.height?.age?.gender    //undefined
 
 
let arr = [1,2,[3,4]]
arr?.[1]   //2
arr?.[2]?.[1]   //3
arr?.[10]    //undefined

??是一个逻辑操作符,只有在左侧的值为null或者undefined 时,才会返回右侧的值,否则返回左侧的值

|| 短路操作符,只在左侧值为false时,返回右侧值

console.log(null ?? 'default')     //default
console.log(undefined ?? 'default')     //default
console.log(0 ?? 'default')     //0
console.log('' ?? 'default')    // ''
 
console.log(null || 'default')     //default
console.log(undefined || 'default')     //default
console.log(0 || 'default')     //default
console.log('' || 'default')    // default

|| 与 && 

console.log( 5 && 4 );//当结果为真时,返回第二个为真的值4 
console.log( 0 && 4 );//当结果为假时,返回第一个为假的值0 
console.log( 5 || 4 );//当结果为真时,返回第一个为真的值5 
console.log( 0 || 0 );//当结果为假时,返回第二个为假的值0 

 

 

参考:

https://www.nowcoder.com/exam/interview/detail?

questionClassifyId=0&questionId=2412346&questionJobId=156&type=1

https://blog.csdn.net/summer_girlcc/article/details/120906121

posted @ 2022-05-20 15:10  Du9191  阅读(165)  评论(0编辑  收藏  举报