###前端如何做好數據保護
1:if形式
if( obj && obj.a && obj.a.b && obj.a.b.c)
存在的問題,如果對象的層數過多,容易忽略並不易保護,甚至有可能出現如下圖情況:某層數據爲空時 後端數據結構會由obj =》 array。讓人防不勝防:如下圖
2: try catch 形式
a)如需對obj.a.b.c.d做保護;我們可以直接通過
try
{
obj.a.b.c.d
!== 2
}
catch(err){
alert(err) // 可執行
alert(123)
// 可執行
}
如果obj.a.b.c.d
!== 2
這樣非法的條件,在try catch中仍可以繼續運行下去,不會影響到整個頁面的執行。但在if中obj.a.b.c.d
!== 2
已經報錯,整個頁面都會掛掉。
如果希望用if寫, obj && obj.a && obj.a.b && obj.a.b.c && obj.a.b.c ==2 這樣是不是很蠢?這時就體現出try catch的妙處了,程序不但知道obj.a.b.c.d
!== 2
是假的,而且直接可以知道究竟哪一步就已經是假的。
b) try catch中
obj.a.b.c.d === 2在try中就可以直接寫,也就是說,我不關心究竟a/b/c/d誰是非法的,我只關心json.a.b.c.d到底是不是等於2,不等於2或者任何一步出錯,對我來講沒有區別,反正都是不等於2,我不關心哪步出錯,而且程序不會壞掉。這是一種比較省心的寫法。
c)try catch 另一個適用場合 也就是兼容性場合,因爲瀏覽器兼容性不是程序員能改正的,所以只能try catch:由於不同瀏覽器的報錯提示是不一樣的,根據捕獲的瀏覽器的報錯提示判斷用戶的瀏覽器,然後做出對應的措施,這時候使用try catch是巧妙的辦法,如果用if就比較笨拙,因爲if通常只能反饋真或假,不能直接反饋瀏覽器的報錯內容。
3:既然try catch形式能很好的做好保護,並即使在保護不當時也能保證頁面不跪;why什麼前端很少有人用try catch?而類似後端java語言,大部分函數都會適用try catch。
然而在前端中正確使用try catch 並不會對頁面性能造成影響,即使是億級的for循環也只有毫秒基本的差別。 前提(使用姿勢要對,即
-
需要注意的性能消耗在於 try catch 中不要直接塞進去太多的代碼(聲明太多的變量),最好是吧所有要執行的代碼放在另一個 function 中,通過調用這個 function 來執行。
)
總結:前端在明顯需要保護的儘量正確使用try catch的形式。即使容錯失敗,頁面也不出掛掉。