JS 中的 a.b.c.d

也许你常常会在代码里需要 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

可是, 不一定是 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

然后 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

可是, 机智的你, 知道 idx 比自己的实现好在哪儿了吗?


  1. Optional Chaining ↩︎