今天項目中報錯TypeError: Cannot read properties of undefined (reading 'filter'),開始報錯沒影響到運行就沒管。后面頁面中其他功能(清空購物車)購物車模塊崩潰了。
直接翻到最下面看2022.3.4和2022.4.22總結。
2022.2.9
// 利用filter過濾在利用reduce累加
return this.cartList.cartInfoList.filter((element,index,arr)=>element.isChecked ===1).reduce((prev,cur,arr)=>(prev + cur.skuPrice*cur.skuNum),0)
在cartList.cartInfoList(購物車)清空后,打印cartList.cartInfoList返回undefined,故需先返回判斷cartList.cartInfoList是否存在
// 判斷購物車列表清單是否清空(也可以判斷父元素this.cartList.length!==0)
if (this.cartList.cartInfoList) {
// 利用filter過濾在利用reduce累加
return this.cartList.cartInfoList.filter((element,index,arr)=>element.isChecked ===1).reduce((prev,cur,arr)=>(prev + cur.skuPrice*cur.skuNum),0)
}else{
return 0
}
同理,在使用對象或數組的方法時,報錯提示TypeError: Cannot read properties of undefined (reading 'filter'),首先想到判斷目標對象或數組是否存在,如果需要可以進一步判斷是數組還是對象,判斷數組Array.isArray,判斷對象Object.prototype.toString。
思考:根據報錯,xxx.filter 中的xxx未定義,filter為數組方法,所以需要判斷數組是否存在才不會報錯。理論上加上一個空數組 || [] 兜底應該也不會報錯了。
2022.2.12
今天又遇到類似問題,Cannot read properties of undefined (reading 'userAddress'),屬性userAddress的對象為undefined。注:上面為什么要這么寫,因為涉及到業務邏輯客戶手動刪除出現清空購物車的情況
只要加上||{}兜底,若為null或者undefined即初始化為空對象{},目的防止出現null或者undefined的錯誤。
思考:根據報錯,xxx.userAddress 中的xxx未定義,userAddress明顯是一個自定義屬性,所以xxx肯定為對象。所以加上一個空對象 ||{} 兜底就不會報錯了。
return arr.find(element=>element.isDefault==1)||{}
//搞清楚||或運算符的定義,第一個條件為真,則不需要執行第二個條件,否則執行第二個條件
2022.3.4
再次遇到這種某個屬性(方法)未定義的問題頁面卻能正常顯示,思考可能是因為對象/數組渲染問題導致的,第一步應該判斷 (reading 'xxx')里的xxx是函數方法(對象or數組的方法)還是自定義屬性(肯定是對象),
這個問題本質是由於渲染早於異步請求數據返回的時間,其實只需要解決報錯undefined的初始化問題,你能理解這個以下方法就很好理解。
一、若報錯的undefinde的屬性為對象或者數組的api,
1.解決方法是在對象/數組后面加上 ||[ ] 或者 ||{ } 兜底,這樣渲染的時候就不會報錯了
二、若報錯的undefined的屬性為自定義屬性,則可以使用以下幾種方法
1.如果數據是在data里面定義的,最笨的方法,把相應數據結構在data寫出來(對應的值為空對象、數組)
2.父級套v-if,數據沒有返回時,節點直接不生成,數據返回,節點生成。(if判斷的開關就用報錯那個屬性)
3.用&&或者if()判斷異步數據已返回,不會用if語句和&&邏輯與 計算布爾值作為開關標識符?點擊站內跳轉←
2022.4.22補充
你發ajax請求,數據還沒回來,卻開始渲染請求來的數據,肯定報undefined啊,為什么有時候又不影響你頁面展示?因為請求的數據經過等待肯定回來了,但是控制台上的undefined無法解決。
補充ES6 優雅的解決方法(本質上同3月4日的第三種方法)