a.b.c.d
JS 中的 也许你常常会在代码里需要 let d = a.b.c.d
, 但是 a
的值不确定的时候, 这样做是非常危险的.
安全的做法是: 我们无时无刻都需要判空
let d = a && a.b && a.b.c && a.b.c.d
1
截止到本文时间, JS 中的 Optional Chaining[1] 仍然只是 Stage 1
的一个提案.
不想要那么多的判空怎么办? 那就大胆的去直接 a.b.c.d
吧! 什么, 会报 Error? try {...} catch(e) {}
你值得拥有.
可是在代码里写那么多 try {...} catch(e) {}
比判空还恶心.
定义一个 function
要是能把 try {...} catch(e) {}
放在一个 function 中就好了.
function Fun() {
try {
return a.b.c.d;
} catch(e) {
return undefined;
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
可是, 不一定是 a.b.c.d
呀, 也可能是 h.i.j.k
呢? 那我们就拿一个自定义函数作为参数传进来吧.
function Fun(run) {
try {
return run();
} catch(e) {
return undefined;
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
然后 let d = a.b.c.d
就可以这样写
let d = Fun(() => a.b.c.d);
1
其实, 你需要的是 idx
facebook 在 github 开源了一个 npm 包: idx
你可以直接
import idx from 'idx';
let d = idx(a, _ => _.b.c.d);
1
2
3
2
3
可是, 机智的你, 知道 idx 比自己的实现好在哪儿了吗?