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