uncaught TypeError: Cannot read property 'c' of undefined
出現這個問題最根本緣由是:前端
當咱們初始化一個對象obj爲{}時候,obj.a這個時候是undefined.咱們打印obj.a能夠獲得undefined,可是咱們打印obj.a.c的時候,就會出現上面的錯誤。js對象中的未初始化屬性值是undefined,從undefined讀取屬性就會致使這個錯誤(同理,null也同樣)ios
如何避免?ajax
js和ts目前都出現了一個可選鏈概念
,例如:編程
const obj = {}; console.log(obj?.b?.c?.d)
上面的代碼並不會報錯,緣由是
?.
遇到是空值的時候便會返回undefined.
前端的接口調用,通常都比較頻繁,咱們這時候能夠考慮使用單例模式,將全部的axios請求都用一個函數封裝一層。統一能夠在這個函數中catch捕獲接口調用時候的未知錯誤,僞代碼以下:axios
function ajax(url,data,method='get'){ const promise = axios[method](url,data) return promise.then(res=>{ }).catch(error){ //統一處理錯誤 } }
那麼只要發生接口調用的未知錯誤都會在這裏被處理了後端
以React爲例promise
部分 UI 的 JavaScript 錯誤不該該致使整個應用崩潰,爲了解決這個問題,React 16 引入了一個新的概念 —— 錯誤邊界。安全
錯誤邊界是一種 React 組件,這種組件能夠捕獲並打印發生在其子組件樹任何位置的 JavaScript 錯誤,而且,它會渲染出備用 UI,而不是渲染那些崩潰了的子組件樹。錯誤邊界在渲染期間、生命週期方法和整個組件樹的構造函數中捕獲錯誤。
使用示例:服務器
class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { // 更新 state 使下一次渲染可以顯示降級後的 UI return { hasError: true }; } componentDidCatch(error, errorInfo) { // 你一樣能夠將錯誤日誌上報給服務器 logErrorToMyService(error, errorInfo); } render() { if (this.state.hasError) { // 你能夠自定義降級後的 UI 並渲染 return <h1>Something went wrong.</h1>; } return this.props.children; } }
注意
錯誤邊界沒法捕獲如下場景中產生的錯誤:異步
這個問題可能遠不止這麼簡單,可是大道至簡,遵循單向數據流的方式去改變數據,例如:
//test.js export const obj = { a:1, b:2 } //使用obj import {obj} from './test.js'; obj.a=3;
當你頻繁使用這個obj
對象時,你沒法根據代碼去知道它的改變順序(即在某個時刻它的值是什麼),並且這裏面可能存在很多異步的代碼,當咱們換一種方式,就能知道它的改變順序了,也更方便咱們debug
例如:
//test.js export const obj = { a:1, b:2 } export function setObj (key,value) { console.log(key,value) obj[key] = value }
這樣,咱們就作到了