国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 微信小程式 微信開(kāi)發(fā) ECMAScript 2020 的新特性

ECMAScript 2020 的新特性

Jun 12, 2020 am 10:57 AM
ecmascript

ECMAScript 2020 的新特性

JavaScript 是最受歡迎的程式語(yǔ)言之一,每年都會(huì)加入新的功能。本文介紹了新增在 ECMAScript 2020(又稱(chēng)ES11)中的新特性。

在引進(jìn) ECMAScript 2015(又稱(chēng) ES6)之前,JavaScript 發(fā)展的非常緩慢。但自 2015 年起,每年都有新特性加入。需要注意的是,不是所有特性都被現(xiàn)代瀏覽器支持,但由於 JavaScript 編譯器 Babel 的存在,我們已經(jīng)可以使用新特性了。本文將介紹 ECMAScript 2020(ES11)的一些最新特性。

Optional Chaining 可選鍊式呼叫


#大部分開(kāi)發(fā)者都曾經(jīng)遇到這個(gè)問(wèn)題:

TypeError: Cannot read property 'x' of undefined

這個(gè)錯(cuò)誤表示我們正在存取一個(gè)不屬於物件的屬性。

存取物件的屬性

const flower = {
    colors: {
        red: true
    }
}
console.log(flower.colors.red) // 正常運(yùn)行

console.log(flower.species.lily) // 拋出錯(cuò)誤:TypeError: Cannot read property 'lily' of undefined

在這種情況下,JavaScript 引擎會(huì)像這樣拋出錯(cuò)誤。但是某些情況下值是否存在並不重要,因?yàn)槲覀冎浪鼤?huì)存在。於是,可選鍊式呼叫就派上用場(chǎng)了!

我們可以使用由一個(gè)問(wèn)號(hào)和一個(gè)點(diǎn)組成的可選鍊式運(yùn)算符,去表示不應(yīng)該引發(fā)錯(cuò)誤。如果沒(méi)有值,應(yīng)該回傳 undefined。

console.log(flower.species?.lily) // 輸出 undefined

當(dāng)存取陣列或呼叫函數(shù)時(shí),也可以使用可選鍊式呼叫。

存取陣列

let flowers =  ['lily', 'daisy', 'rose']

console.log(flowers[1]) // 輸出:daisy

flowers = null

console.log(flowers[1]) // 拋出錯(cuò)誤:TypeError: Cannot read property '1' of null
console.log(flowers?.[1]) // 輸出:undefined

呼叫函數(shù)

let plantFlowers = () => {
  return 'orchids'
}

console.log(plantFlowers()) // 輸出:orchids

plantFlowers = null

console.log(plantFlowers()) // 拋出錯(cuò)誤:TypeError: plantFlowers is not a function

console.log(plantFlowers?.()) // 輸出:undefined

Nullish Coalescing 空值合併



#目前,要為變數(shù)提供回退值,邏輯運(yùn)算子|| 還是必須的。它適用於許多情況,但不能應(yīng)用在一些特殊的場(chǎng)景。例如,初始值是布林值或數(shù)字的情況。舉例說(shuō)明,我們要把數(shù)字賦值給一個(gè)變量,當(dāng)變數(shù)的初始值不是數(shù)字時(shí),就預(yù)設(shè)為7 :
let number = 1
let myNumber = number || 7

變數(shù)myNumber 等於1,因?yàn)樽筮叺模╪umber)是一個(gè)真值1 。但是,當(dāng)變數(shù) number 不是 1 而是 0 呢?

let number = 0
let myNumber = number || 7

0 是?假?值,所以即使 0 是數(shù)字。變數(shù)?myNumber?將會(huì)被賦值為右邊的 7。但結(jié)果不是我們想要的。幸好,由兩個(gè)問(wèn)號(hào)組成:???的合併運(yùn)算子就可以檢查變數(shù)?number?是否是一個(gè)數(shù)字,而不用寫(xiě)額外的程式碼了。

let number = 0
let myNumber = number ?? 7
運(yùn)算子右邊的值只在左邊的值等於 null 或 undefined 時(shí)有效,因此,範(fàn)例中的變數(shù) myNumber 現(xiàn)在的值等於 0 了。


Private Fields 私有欄位

許多具有 classes 的程式語(yǔ)言允許定義類(lèi)別作為公共的,受保護(hù)的或私有的屬性。 Public 屬性可以從類(lèi)別的外部或子類(lèi)別訪(fǎng)問(wèn),protected 屬性只能被子類(lèi)別訪(fǎng)問(wèn),private 屬性只能被類(lèi)別內(nèi)部存取。 JavaScript 從 ES6 開(kāi)始支援類(lèi)別語(yǔ)法,但直到現(xiàn)在才引入了私有欄位。要定義私有屬性,必須在其前面加上雜湊符號(hào):#。

class Flower {
  #leaf_color = "green";
  constructor(name) {
    this.name = name;
  }

  get_color() {
    return this.#leaf_color;
  }
}

const orchid = new Flower("orchid");

console.log(orchid.get_color()); // 輸出:green
console.log(orchid.#leaf_color) // 報(bào)錯(cuò):SyntaxError: Private field '#leaf_color' must be declared in an enclosing class
如果我們從外部存取類(lèi)別的私有屬性,勢(shì)必會(huì)報(bào)錯(cuò)。


Static Fields 靜態(tài)欄位

如果想使用類(lèi)別的方法,首先必須實(shí)例化一個(gè)類(lèi),如下所示:

class Flower {
  add_leaves() {
    console.log("Adding leaves");
  }
}

const rose = new Flower();
rose.add_leaves();

Flower.add_leaves() // 拋出錯(cuò)誤:TypeError: Flower.add_leaves is not a function

試圖去存取沒(méi)有實(shí)例化的?Flower?類(lèi)別的方法將會(huì)拋出一個(gè)錯(cuò)誤。但由於?static?字段,類(lèi)別方法可以被?static?關(guān)鍵字聲明然後從外部呼叫。

class Flower {
  constructor(type) {
    this.type = type;
  }
  static create_flower(type) {
    return new Flower(type);
  }
}

const rose = Flower.create_flower("rose"); // 正常運(yùn)行

Top Level Await 頂級(jí) Await

目前,如果用?await?取得 promise 函數(shù)的結(jié)果,那麼使用?await?的函數(shù)必須用?async?關(guān)鍵字定義。

const func = async () => {
    const response = await fetch(url)
}

頭痛的是,在全域作用域中去等待某些結(jié)果基本上是不可能的。除非使用?立即呼叫的函數(shù)表達(dá)式(IIFE)。

(async () => {
    const response = await fetch(url)
})()
但引入了?頂級(jí)Await?後,不需要再把程式碼包裹在一個(gè)async 函數(shù)中了,如下即可:

const response = await fetch(url)

這個(gè)特性對(duì)於解決模組依賴(lài)或當(dāng)初始來(lái)源無(wú)法使用而需要備用電源的時(shí)候是非常有用的。

let Vue
try {
    Vue = await import('url_1_to_vue')
} catch {
    Vue = await import('url_2_to_vue)
}

Promise.allSettled 方法######等待多個(gè) promise 回傳結(jié)果時(shí),我們可以用 Promise.all([promise_1, promise_2])。但問(wèn)題是,如果其中一個(gè)請(qǐng)求失敗了,就會(huì)拋出錯(cuò)誤。然而,有時(shí)候我們希望某個(gè)請(qǐng)求失敗後,其他請(qǐng)求的結(jié)果能夠正?;貍鳌a槍?duì)這種情況 ES11 引入了 Promise.allSettled 。 ###
promise_1 = Promise.resolve('hello')
promise_2 = new Promise((resolve, reject) => setTimeout(reject, 200, 'problem'))

Promise.allSettled([promise_1, promise_2])
    .then(([promise_1_result, promise_2_result]) => {
        console.log(promise_1_result) // 輸出:{status: 'fulfilled', value: 'hello'}
        console.log(promise_2_result) // 輸出:{status: 'rejected', reason: 'problem'}
    })
###成功的 promise 將傳回一個(gè)包含 status 和 value 的對(duì)象,失敗的 promise 將會(huì)傳回一個(gè)包含 status 和 reason 的物件。 #########Dynamic Import 動(dòng)態(tài)引入############你也許在 webpack 的模組綁定中已經(jīng)使用過(guò)動(dòng)態(tài)引入。但對(duì)於該特性的原生支援已經(jīng)到來(lái):###
// Alert.js
export default {
    show() {
        // 代碼
    }
}


// 使用 Alert.js 的文件
import('/components/Alert.js')
    .then(Alert => {
        Alert.show()
    })

考慮到許多應(yīng)用程序使用諸如 webpack 之類(lèi)的模塊打包器來(lái)進(jìn)行代碼的轉(zhuǎn)譯和優(yōu)化,這個(gè)特性現(xiàn)在還沒(méi)什么大作用。

MatchAll 匹配所有項(xiàng)


如果你想要查找字符串中所有正則表達(dá)式的匹配項(xiàng)和它們的位置,MatchAll 非常有用。

const regex = /\b(apple)+\b/;
const fruits = "pear, apple, banana, apple, orange, apple";


for (const match of fruits.match(regex)) {
  console.log(match); 
}
// 輸出 
// 
// 'apple' 
// 'apple'

相比之下,matchAll 返回更多的信息,包括找到匹配項(xiàng)的索引。

for (const match of fruits.matchAll(regex)) {
  console.log(match);
}

// 輸出
// 
// [
//   'apple',
//   'apple',
//   index: 6,
//   input: 'pear, apple, banana, apple, orange, apple',
//   groups: undefined
// ],
// [
//   'apple',
//   'apple',
//   index: 21,
//   input: 'pear, apple, banana, apple, orange, apple',
//   groups: undefined
// ],
// [
//   'apple',
//   'apple',
//   index: 36,
//   input: 'pear, apple, banana, apple, orange, apple',
//   groups: undefined
// ]

globalThis 全局對(duì)象


JavaScript 可以在不同環(huán)境中運(yùn)行,比如瀏覽器或者 Node.js。瀏覽器中可用的全局對(duì)象是變量 window,但在 Node.js 中是一個(gè)叫做 global 的對(duì)象。為了在不同環(huán)境中都使用統(tǒng)一的全局對(duì)象,引入了 globalThis 。

// 瀏覽器
window == globalThis // true

// node.js
global == globalThis // true

BigInt


JavaScript 中能夠精確表達(dá)的最大數(shù)字是 2^53 - 1。而 BigInt 可以用來(lái)創(chuàng)建更大的數(shù)字

const theBiggerNumber = 9007199254740991n
const evenBiggerNumber = BigInt(9007199254740991)

結(jié)論


我希望這篇文章對(duì)您有用,并像我一樣期待 JavaScript 即將到來(lái)的新特性。如果想了解更多,可以看看 tc39 委員會(huì)的官方Github倉(cāng)庫(kù)。

推薦教程:《JS教程

以上是ECMAScript 2020 的新特性的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線(xiàn)上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話(huà)題