ES2020整理:?和??葡秒,動態(tài)加載,BigInt嵌溢,Promise.allSettled

ES2020 學(xué)習(xí)筆記

原文地址

1. babel 環(huán)境配置

babel 版本在7.8以上眯牧,babel-cli 8以上均支持es2020中的語法,具體可參照本項目的webpack配置

2. es2020 中值得關(guān)注的點

對象定義中的私有變量

當(dāng)我們創(chuàng)建一個類的時候赖草,該類會在各個場景下被使用学少,可能我們并不希望每一個內(nèi)部的參數(shù)都被全局共享,因此在方法或者變量前添加#秧骑,使得該方法或者類名只在類內(nèi)部可用

class Person {
  #type = "man";

  constructor(name) {
    this.name = name;
  }

  showType() {
    console.log(`${this.name} is ${this.#type}`);
  }
}

const jack = new Person("Jack");

jack.showType(); // Jack is man

jack.#type // Error: #type is private value

在外部調(diào)用私有變量的話就會報錯

使用方法:在類內(nèi)部屬性或者變量前加入#號版确,使得變量變?yōu)樗接凶兞?/strong>

Promise.allSettled

當(dāng)我們使用多 promise 的時候扣囊,特別是當(dāng)每個 promise 之間存在以來關(guān)系的時候,記錄每個 Promise 的返回值對錯誤調(diào)試而言是很重要的绒疗。使用 Promise.allSettled侵歇,創(chuàng)造了一種新的 promise,通過該 promise 所有傳入的 promise 全部完成后會返回一個數(shù)組吓蘑,該數(shù)組中包含了每一個 promise 的返回值和狀態(tài)

const promise1 = new Promise((resolve, reject) =>
  setTimeout(() => {
    resolve({ type: "success", msg: "Yes" });
  }, 1000)
);

const promise2 = new Promise((resolve, reject) =>
  setTimeout(() => {
    reject({ type: "fail", msg: "No" });
  }, 2000)
);

Promise.all([promise1, promise2])
  .then(data => {
    console.log("success=");
    console.log(data);
  })
  .catch(data => {
    console.log("fail=");
    console.log(data);
  });

// 過了兩秒會顯示 { type: "fail", msg: "No" }
// 使用Promise.all只會返回錯誤的promise返回的信息
// 而正確的Promise返回的信息并不會被得到

Promise.allSettled([promise1, promise2]).then(data => {
  console.log("allSettled");
  console.log(data);
});

/*
[
    {
        status: 'fullfilled',
        value: { type: "success", msg: "Yes" }
    }, {
        status: 'rejected',
        value: { type: "fail", msg: "No" }
    }
]

*/

Nullish Coalescing Operator(不知道怎么翻譯 QAQ)

由于 JavaScript 具有動態(tài)類型的特點惕虑,因此在變量賦值的時候需要記住一個變量在 JavaScript 中的真假值。比如:當(dāng)一個對象中含有某些之士修,我們希望給他一個“假”的初始值枷遂,之后通過判斷來改寫他,我們會賦值給他例如數(shù)字 0, 空字符串等等棋嘲。但是如果0和空字符串本身是有意義的酒唉,這樣做就會存在問題。

通常情況下使用 || 來進行默認(rèn)值的賦值

let person = {
  profile: {
    name: "",
    age: 0
  }
};

console.log(person.profile.name || "Anonymous"); // Anonymous
console.log(person.profile.age || 18); // 18

而在對象當(dāng)中沸移,我們想要賦值的情況是痪伦,如果為 null 或者 undefined 的時候,賦予默認(rèn)值雹锣,其他時候保持原樣网沾,因此提出了??運算符

可選鏈?zhǔn)秸{(diào)用

類似于??操作符,JavaScript 現(xiàn)在是能夠處理值為 undefined 和 null 的情況蕊爵,但是如果對象或者數(shù)組調(diào)用的路徑是 undefined 會怎么樣?

為了能夠通過繼續(xù)訪問該變量辉哥,在.操作符之前增加一個?符號,用于模擬出一個可選的路徑攒射。

如果不存在該值醋旦,則返回 undefined

const a = {};

console.log(a.b.c); // 這里會報Err, 無法從undefined中得到c

console.log(person?.profile?.name); // ""
console.log(person?.hobby?.work); // undefined

console.log(person?.hobby?.work ?? "no Work"); // no Work

可選鏈?zhǔn)秸{(diào)用在函數(shù)和數(shù)組上的調(diào)用方法

依然是?和.操作符

BigInt

目前 JavaScript 能夠處理的最大的數(shù)為 2^53,即最大安全整數(shù) Number.MAX_SAFE_INTEGER
根據(jù)你不知道的 JavaScript 中卷中描述会放,在處理的超過安全范圍的數(shù)的時候會出現(xiàn)問題
另外饲齐,對于非安全最大數(shù) MAX_VALUE,由于采取的是向接近數(shù)取整的原則,更是有各種問題

如:

Math.pow(2, 53) === Math.pow(2, 53) + 1; // true

Number.MAX_VALUE + Number.MAX_VALUE === Infinity; // true

Number.MAX_VALUE + 1 === Number.MAX_VALUE; // true

我們可以通過 BigInt 來解決這個問題咧最。通過在數(shù)字末尾添加字母 n捂人,來實現(xiàn)一個 BigInt 類型。
但是我們不能混用 BigInt 和 number 類型矢沿,因此在使用運算的時候我們都需要通過 BigInt 類型進行計算

// BigInt
a = 1000000000000000000000000000000000000000000000n;
b = 2n;
c = 2;

console.log(a * b); // 2000000000000000000000000000000000000000000000n
console.log(a * c); // Cannot mix BigInt and other types, use explicit conversions

動態(tài)加載

如果你需要在代碼中的部分場景中滥搭,使用一個工具類中的部分極少的函數(shù),但是我們直接引入依賴可能會造成資源的浪費咨察,現(xiàn)在可以通過 async/await 異步的方式论熙,在我們需要依賴的時候動態(tài)加載依賴項

// add.js

export const add = (a, b) => a + b;

// index.js
let math;

const useAdd = async (num1, num2) => {
  const _math = math ?? (await import("./add.js"));

  math = _math ?? add;

  const value = math?.add?.(num1, num2);

  console.log(value);
};

useAdd(1, 2); // 3
useAdd(4, 5); // 9
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摄狱,隨后出現(xiàn)的幾起案子脓诡,更是在濱河造成了極大的恐慌无午,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祝谚,死亡現(xiàn)場離奇詭異宪迟,居然都是意外死亡,警方通過查閱死者的電腦和手機交惯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門次泽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人席爽,你說我怎么就攤上這事意荤。” “怎么了只锻?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵玖像,是天一觀的道長。 經(jīng)常有香客問我齐饮,道長捐寥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任祖驱,我火速辦了婚禮握恳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捺僻。我一直安慰自己乡洼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布匕坯。 她就那樣靜靜地躺著就珠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪醒颖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天壳炎,我揣著相機與錄音泞歉,去河邊找鬼。 笑死匿辩,一個胖子當(dāng)著我的面吹牛腰耙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铲球,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼挺庞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稼病?” 一聲冷哼從身側(cè)響起选侨,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤掖鱼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后援制,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戏挡,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年晨仑,在試婚紗的時候發(fā)現(xiàn)自己被綠了褐墅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡洪己,死狀恐怖妥凳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情答捕,我是刑警寧澤逝钥,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站噪珊,受9級特大地震影響晌缘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痢站,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一磷箕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阵难,春花似錦岳枷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朱庆,卻和暖如春盛泡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背娱颊。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工傲诵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箱硕。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓拴竹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剧罩。 傳聞我的和親對象是個殘疾皇子栓拜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容