javascript 中的可選鏈式呼叫
資源參照 Fun Fun Fucntion, 這裡對作者表示感謝!
const user = { name:'zideajang'} const zip = user?address?.zip console.log(zip)
這個符號我在 kotlin 中見過,可能 c# 中也有相應的符號吧。如果我們現在執行一定會報錯,即使我們去掉?其實有時候學習一門新的語言,並不一定馬上就會用上,或者以後也不會用上,但是至少新的語言為我們開了一扇新的大門,我們更多的見識,然後將一些語言的好的特性融入我們的開發中。
這個將在不久將來 javascript 版本中給與支援,不過現在我們也可以體驗這個特性。
當然我們通過邏輯來達到這個目的,
const user = { name:'zideajang'} const zip = user && user.address && user.address.zip console.log(zip)
也可以這樣做,像這樣程式碼塊我們應該隨手不加思索地寫出來。
const user = { name:'zideajang'} const zip = user ?undefined : user.address ? undefined : user.address.zip console.log(zip)
還可以這樣
onst user = { name:'zideajang'} let zip try { zip = user.address.zip } catch (error) { zip = undefined } console.log(zip)
當然可以寫一個方法來實現這個樣功能,開始動手造輪子。
function get(obj, ...props){ const val = obj[props[0]] if(props.length === 1 || !val) return val const rest = props.slice(1) return get.apply(null,[val,...rest]) } const user = { name:'zideajang'} const zip = get(user,'address','zip') console.log(zip)
我們也可以引用第三方庫來實現,這個 ramda 我還是第一次接觸,準備以後研究一些。用起來也非常簡單。
const R = require('ramda'); const user = { name:'zideajang'} const userWithAdress = { name:'zideajang',address:{zip:2019}} // const zip = get(user,'address','zip') console.log(R.path(['address','zip'],user)) console.log(R.path(['address','zip'],userWithAdress))
暫時我們還無法向 kotlin 那樣進行可選呼叫,經過再三考慮最終使用
const zip = get(user,'address','zip')
這種方式還是最佳的可選鏈式呼叫,期望在新的版本中我們找到?這個鏈式可選呼叫操作符,這樣我們就不用自己造輪子了。