若是你們閱讀過我以前寫的一篇關於ES6解構的文章,那必定會了解到解構達到數據防護功能,那麼本文要介紹的是另外一種數據防護方式Optional Chaining(可選鏈)。git
Optional Chaining容許咱們檢查對象是否存在,而後才試圖訪問它的屬性。其餘編譯語言也有相似的功能,如C#的 Null-conditional operator
。github
在訪問對象或數組以前,您是否曾經檢查過它的屬性?若是你不檢查,你可能會遇到如下問題:segmentfault
if (a && a.b && a.b.length > 0) { console.log('666'); }
之因此執行這些檢查,是由於 JavaScript的對象不須要事先聲明結構或schema。所以,若是不判斷他的父級是否爲一個對象就開始訪問其屬性可能會遇到錯誤:
當b爲undefined
時就報錯了。數組
若是使用 Optional Chaining ,代碼居然能夠如此簡潔:babel
if (a?.b?.length > 0) { console.log('666'); }
怎麼樣? 告別了繁瑣各類 & 和 各類層層檢查,這又是一股清流。
可是,請記住可選的連接操做符是?.
不是?
這意味着當你訪問數組其中一個元素時,應該這樣:ide
const firstItem = a?.b?.[0]; // right const firstItem = a?.b?[0]; // wrong
一樣地,若是你要訪問一個函數時,應該這樣:函數
const execFunc = a?.func?.(); // right const execFunc = a?.func?(); // wrong
除了數據防護,Optional Chaining 還可使用在更多的場景中:
判斷並執行函數spa
a?.(); // 等價於 a == null ? undefined : a(); // 等價於 a && a();
條件執行.net
a?.[++x]; // 等價於 a == null ? undefined : a[++x];
a?.b.c(++x).d; // 等價於 a == null ? undefined : a.b.c(++x).d;
更加複雜的嵌套插件
a?.b[3].c?.(x).d // 等價於 a == null ? undefined : a.b[3].c == null ? undefined : a.b[3].c(x).d; // 注:嵌套一出來不管怎麼寫,感受可讀性不強了,因此,別炫技。
也能夠分組,可讀性更強
(a?.b).c; // 等價於 (a == null ? undefined : a.b).c;
刪除對象中的屬性
delete a?.b // 等價於 a == null ? undefined : delete a.b
?.
先判斷他的Left-Hand-Side 是不是null
或 undefined
,若是是,那麼此表達式短路並返回 undefined
,不然,表達式依次類推執行到最後。
Optional Chaining目前在Stage 1階段。 在使用以前,你們能夠先到這裏體驗一波: codepan
雖然目前Optional Chaining 是草案,但能夠經過 Babel 插件 babel-plugin-syntax-optional-chaining 來嚐鮮。