资源参照 Fun Fun Fucntion, 这里对作者表示感谢!
const user = { name:'zideajang'}const zip = user?address?.zipconsole.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.zipconsole.log(zip)
还可以这样
onst user = { name:'zideajang'}let ziptry { 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')
这种方式还是最佳的可选链式调用,期望在新的版本中我们找到?这个链式可选调用操作符,这样我们就不用自己造轮子了。