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 

 

 

參考:

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

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

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

Tags: