undefined與null與?. ??

Du9191發表於2022-05-20

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

相關文章