成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用 Optional Chaining 做數(shù)據(jù)防御

zhonghanwen / 1165人閱讀

摘要:如果大家閱讀過(guò)我之前寫(xiě)的一篇關(guān)于解構(gòu)的文章,那一定會(huì)了解到解構(gòu)達(dá)到數(shù)據(jù)防御功能,那么本文要介紹的是另一種數(shù)據(jù)防御方式可選鏈。什么是允許我們檢查對(duì)象是否存在,然后才試圖訪問(wèn)它的屬性。如何使用目前在階段。

如果大家閱讀過(guò)我之前寫(xiě)的一篇關(guān)于ES6解構(gòu)的文章,那一定會(huì)了解到解構(gòu)達(dá)到數(shù)據(jù)防御功能,那么本文要介紹的是另一種數(shù)據(jù)防御方式Optional Chaining(可選鏈)。

什么是Optional Chaining

Optional Chaining允許我們檢查對(duì)象是否存在,然后才試圖訪問(wèn)它的屬性。其他編譯語(yǔ)言也有類似的功能,如C#的 Null-conditional operator。

為什么我們需要Optional Chaining

在訪問(wèn)對(duì)象或數(shù)組之前,您是否曾經(jīng)檢查過(guò)它的屬性?如果你不檢查,你可能會(huì)遇到以下問(wèn)題:

if (a && a.b && a.b.length > 0) {
    console.log("666");
}

之所以執(zhí)行這些檢查,是因?yàn)?JavaScript的對(duì)象不需要事先聲明結(jié)構(gòu)或schema。因此,如果不判斷他的父級(jí)是否為一個(gè)對(duì)象就開(kāi)始訪問(wèn)其屬性可能會(huì)遇到錯(cuò)誤:

當(dāng)b為undefined時(shí)就報(bào)錯(cuò)了。

Optional Chaining 可以解決什么問(wèn)題呢?

如果使用 Optional Chaining ,代碼竟然可以如此簡(jiǎn)潔:

if (a?.b?.length > 0) {
    console.log("666");
}

怎么樣? 告別了繁瑣各種 & 和 各種層層檢查,這又是一股清流。
但是,請(qǐng)記住可選的鏈接操作符是?.不是? 這意味著當(dāng)你訪問(wèn)數(shù)組其中一個(gè)元素時(shí),應(yīng)該這樣:

const firstItem = a?.b?.[0]; // right
const firstItem = a?.b?[0]; // wrong

同樣地,如果你要訪問(wèn)一個(gè)函數(shù)時(shí),應(yīng)該這樣:

const execFunc = a?.func?.(); // right
const execFunc = a?.func?(); // wrong
更多玩法

除了數(shù)據(jù)防御,Optional Chaining 還可以使用在更多的場(chǎng)景中:
判斷并執(zhí)行函數(shù)

a?.();
// 等價(jià)于
a == null ? undefined : a();
// 等價(jià)于
a && a();

條件執(zhí)行

a?.[++x];
// 等價(jià)于
a == null ? undefined : a[++x];
a?.b.c(++x).d;
// 等價(jià)于
a == null ? undefined : a.b.c(++x).d;

更加復(fù)雜的嵌套

a?.b[3].c?.(x).d
// 等價(jià)于
a == null ? undefined : a.b[3].c == null ? undefined : a.b[3].c(x).d;
// 注:嵌套一出來(lái)無(wú)論怎么寫(xiě),感覺(jué)可讀性不強(qiáng)了,所以,別炫技。

也可以分組,可讀性更強(qiáng)

(a?.b).c;
// 等價(jià)于
(a == null ? undefined : a.b).c;

刪除對(duì)象中的屬性

delete a?.b
// 等價(jià)于
a == null ? undefined : delete a.b
Optional Chaining 是如何工作的?

?.先判斷他的Left-Hand-Side 是否是nullundefined,如果是,那么此表達(dá)式短路并返回 undefined,否則,表達(dá)式依次類推執(zhí)行到最后。

如何使用?

Optional Chaining目前在Stage 1階段。 在使用之前,大家可以先到這里體驗(yàn)一波: codepan
雖然目前Optional Chaining 是草案,但可以通過(guò) Babel 插件 babel-plugin-syntax-optional-chaining 來(lái)嘗鮮。

參考資料

proposal-optional-chaining

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94993.html

相關(guān)文章

  • 精讀《Optional chaining

    摘要:由于具備一定的使用場(chǎng)景,而且支持方式零成本改寫(xiě)為即可,所以就支持它吧不支持的特性下面三個(gè)特性不支持,原因是沒(méi)什么使用場(chǎng)景安全的安全的上面兩者的結(jié)合首先看一個(gè)對(duì)象,如果出來(lái)的結(jié)果是,那這個(gè)返回值使用起來(lái)也沒(méi)有意義。 1. 引言 備受開(kāi)發(fā)者喜愛(ài)的特性 Optional chaining 在 2019.6.5 進(jìn)入了 stage2,讓我們?cè)敿?xì)讀一下草案,了解一下這個(gè)特性的用法以及討論要點(diǎn)。 ...

    cncoder 評(píng)論0 收藏0
  • 即將到來(lái) Javascript 三個(gè)改變, 你會(huì)很喜歡它們的,因?yàn)榇_實(shí)是方便了很多!

    摘要:你將看到它們的語(yǔ)法時(shí)時(shí)關(guān)注它們的進(jìn)展與更新。標(biāo)準(zhǔn)有個(gè)版本,個(gè)發(fā)布第個(gè)版本被放棄了。此建議的目的只是避免在起草建議被放棄或發(fā)生重大帶來(lái)的麻煩。如果使用過(guò)度,將導(dǎo)致性能下降。在這個(gè)場(chǎng)景中,數(shù)字和空字符串都被認(rèn)為是假的。 showImg(https://segmentfault.com/img/bVbj2Az?w=2000&h=1333); 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)...

    tinysun1234 評(píng)論0 收藏0
  • [Frontend Tips] JS: Optional Chaining, 再也不怕一長(zhǎng)串的屬性調(diào)

    摘要:剛才看了下一個(gè)新特性,這是干啥用的呢過(guò)去在屬性鏈的調(diào)用中,很容易因?yàn)槟硞€(gè)屬性不存在而導(dǎo)致之后出現(xiàn)的錯(cuò)誤。要注意操作符是,而不是單獨(dú)的。類似的,如果需要取屬性鏈中某函數(shù)并執(zhí)行,就應(yīng)該是。 剛才看了下一個(gè) JS 新特性——「Optional Chaining」,這是干啥用的呢? 過(guò)去在 Object 屬性鏈的調(diào)用中,很容易因?yàn)槟硞€(gè)屬性不存在而導(dǎo)致之后出現(xiàn)Cannot read proper...

    K_B_Z 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<