ES2020的這些新功能令人期待

2021-10-08 04:09:07 字數 4022 閱讀 6851

const user = }}

}}}if(user && user.address)

if(user && user.address && user.address.prop1 && user.address.prop1.prop2 && user.address.prop1.prop2.prop3 && user.address.prop1.prop2.prop3.prop4)

//訪問不存在的屬性

console.log(user.address.prop102.po);

//error

如上所示,在訪問屬性前,你必須檢查所訪問層級中的屬性是否存在,以防止出現cannot read property 『po』 of undefined錯誤。而隨著巢狀級別的增加,你手動檢查的屬性數量也將隨之增加。這意味著一旦我們漏過一項,將會在程式中引發undefined或null物件錯誤,導致應用出現問題。

可選鏈結功能出現後

而隨著可選鏈結功能的出現,我們的工作將會變得比較輕鬆,通過使用可選鏈結運算子「?.」我們可以訪問深度巢狀的物件,而不必檢查其是否未定義或null物件。

讓我們看看它是如何使用的:

const user = }}

}}}console.log(user?.address?.zip);

//600028

console.log(user?.address?.prop1?.prop2?.prop3?.prop4?.value);

//sample

//accessing unexisting property

console.log(user?.address?.prop102?.po);

//undefined

es2020通過引入乙個 ?. 操作符成功減少了許多**。

空值合併(nullish coalescing)

當我第一次聽說這個功能時,我認為這是另乙個令人值得期待的功能,因為我就曾因為在大量重複手動實現該功能時,非常期待有類似這個功能的出現。

空值合併可以讓你檢查nullish值而不是falsey值。nullish值是指null或undefined,falsey值是指空字串,數字0, undefined,null,false,nan,等值。雖然看起來好像這兩個值沒什麼區別,但實際上差異卻很大。

在空值合併之前

我最近在做乙個專案,其中需要增加暗夜模式的切換功能。我必須檢查輸入是否為 true或者false。如果使用者沒有設定任何值,預設它應該為true。下面是我如何在空值合併出現前實現它的**。

const darkmodepreference1 = true

const darkmodepreference2 = false

const darkmodepreference3 = undefined

const darkmodepreference4 = null

const getuserdarkmodepreference = (darkmodepreference) =>

return true

}getuserdarkmodepreference(darkmodepreference1)

// true

getuserdarkmodepreference(darkmodepreference2)

// false

getuserdarkmodepreference(darkmodepreference3)

// true

getuserdarkmodepreference(darkmodepreference4)

// true

在空值合併出現後

在使用空值合併後,你所要做的就是使用??操作符。不再需要 if 語句。

const darkmodepreference1 = true

const darkmodepreference2 = false

const darkmodepreference3 = undefined

const darkmodepreference4 = null

const getuserdarkmodepreference = (darkmodepreference) =>

getuserdarkmodepreference(darkmodepreference1)

// true

getuserdarkmodepreference(darkmodepreference2)

// false

getuserdarkmodepreference(darkmodepreference3)

// true

getuserdarkmodepreference(darkmodepreference4)

// true

這裡的邏輯是,如果變數darkmodepreference包含乙個空值,那麼就把true賦給它,使用這個特性的**簡單易懂。

動態匯入

此功能將幫助你的應用更高效地執行。動態匯入允許你實時地在應用中以模組的形式按需匯入js檔案。在es2020之前,無論你是否使用了該模組,都應該提前匯入它。

讓我們看看如何在動態匯入之前和之後如何實現這一點有什麼異同。

import from 『./export-as-pdf.js』

const exportpdfbutton = document.queryselector(』.exportpdfbtn』);

exportpdfbutton.addeventlistener(『click』, exportaspdf);

這種開銷可以通過使用延遲載入模組來減少。可以通過**分離(code-splitting)來實現,**分離已經可以通過webpack或其他模組打包工具來實現。

但是在es2020中我們以原生的方式來實現這個功能,不再需要模組打包工具等其他方式減少開銷了。

動態匯入之後

const exportpdfbutton = document.queryselector(』.exportpdfbtn』);

exportpdfbutton.addeventlistener(『click』, () => )

.catch(err => )

})如上面的**中所看到的那樣,現在可以按需載入所使用的模組,從而減少應用的開銷和頁面載入時間。

這可能不是你想要的。如果你的需求是不關心它們的結果,只需將它們全部執行,你可以使用新的promise.allsettled()方法。這種方法只有在你所有的promise都執行完成之後才會呼叫。

使用 promise.all

const promisearray = [

promise.resolve(100),

promise.reject(null),

promise.resolve(「data release」),

promise.reject(new error(『something went wrong』))];

promise.all(promisearray)

.then(data => console.log(『all resolved! here are the resolve values:』, data))

.catch(err => console.log(『got rejected! reason:』, err))

//got rejected! reason: null

如上面的**,當乙個promise失敗時,會引發錯誤。

使用 promise.allsettled

1const promisearray = [

promise.resolve(100),

promise.reject(null),

promise.resolve(「data release」),

promise.reject(new error(『something went wrong』))];

promise.allsettled(promisearray).then(res =>).catch(err => console.log(err));

//[//,

//,//,

////]

深圳**建設www.sz886.com

ES2020的js新特性

1.可選鏈 可選鏈,操作符,在訪問屬性或方法時,若存在為空的中間量,則返回undefined,在長鏈條的屬性訪問時,可節省 const stu const cityname stu.address?city?name cityname undefined const res stu.somemeth...

ES2020新語法 空值合併運算子

空值合併操作符 是乙個邏輯操作符,當左側的運算元為null或者undefined時,返回其右側運算元,否則返回左側運算元。const a null?default string default string const b undefined 32 32與邏輯或操作符 不同,邏輯或操作符會在左側運算...

2020新的起點

現在這個時間去談論2020,會發現這是乙個不平凡的年份,因為一場肺炎疫情,讓整個中國陷入了一場全民停工停產的活動中。在2019年的年末,每個人還對2020年充滿無限期待,而除夕開始的全國的人民不出家門,讓大家的生活陷入了恐慌。而我作為與疫情相關的公司部門,僅僅回家只呆了7天,就回到公司,開始了為期兩...