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