一文概述ES7~12的語法及其相關(guān)使用規(guī)則
前言
本文旨在介紹ES7~12一些常用的語法,有些特性篇幅較多,會專門寫文章介紹。
JavaScript這門語言在設(shè)計之初,其實會存在某些問題,隨著JavaScript這門語言越來越流行, ECMA國際標準化組織在ES5的基礎(chǔ)上,推出了許多新特性以補充之前不足的地方,使得JavaScript這門語言越來越完善,那么今天我就將講述一些比較常用的ES7~12的新特性,一起來看看吧。
看完本文,你將:
- 你將會了解ES7~12的常用的語法
- 你將會了解這些語法的常用使用規(guī)則
一起來看看吧
ES7
數(shù)組的includes方法
ES7中新增了數(shù)組的includes方法,該方法旨在判斷數(shù)組中是否存在某個元素。
在ES7之前,判斷數(shù)組中是否存在某個元素,可以用indexOf,但是如果數(shù)組中有NaN,則判斷不出來, 例如:
const names = ["a", "b", "c", "d", NaN] if (names.indexOf("c") !== -1) { console.log("包含元素") } if (names.indexOf("NaN") !== -1) { console.log("包含元素") } //E
includes方法中第一個參數(shù)可以傳入要判斷的元素,第二個參數(shù)傳入索引值,表示從索引值位置開始查找:
const names = ["a", "b", "c", "d", NaN] if (names.includes("NaN") !== -1) { console.log("包含元素")//可以輸出 } if (names.includes("b", 2)) { console.log("包含b元素")//不可以輸出 } if (names.includes("b", 1)) { console.log("包含b元素")//可以輸出 }
指數(shù)的運算方法
ES7中新增了指數(shù)的運算方法,該方法旨在使指數(shù)寫法更簡便。
ES7之前:
Math.pow(),第一個參數(shù)傳入底數(shù),第二個參數(shù)傳入指數(shù)
const result1 = Math.pow(3, 2) console.log(result1)//9
ES7:用**寫法
const result2 = 3 ** 2; console.log(result2)//9
ES8
Object的values
Object.keys獲取對象所有的屬性名
Object.values獲取對象所有的屬性名,例如:
const obj = { name: "cy", age: 18 } console.log(Object.keys(obj))//[ 'name', 'age' ] console.log(Object.values(obj))//[ 'cy', 18 ]
如果參數(shù)里傳入的是數(shù)組,返回數(shù)組本身:
console.log(Object.values([“a”, “b”, “c”]))//[ ‘a’, ‘b’, ‘c’ ]
參數(shù)里傳入的是字符串,返回的是其每個字母拆分后轉(zhuǎn)化后形成的數(shù)組:
console.log(Object.values(“abc”))//[ ‘a’, ‘b’, ‘c’ ]
Object的entries
Object.entries將一個對象轉(zhuǎn)化成數(shù)組,對象的其中的每個屬性鍵值對放在子數(shù)組里面。
例如:
const obj = { name: "cy", age: 18 } console.log(Object.entries(obj))//[ [ 'name', 'cy' ], [ 'age', 18 ] ]
如果傳入的是數(shù)組,則每個子數(shù)組里面的鍵的值為索引號,例如:
console.log(Object.entries(["a", "b", "n"]))//[ [ '0', 'a' ], [ '1', 'b' ], [ '2', 'n' ] ]
如果傳入的是字符串,和數(shù)組的情況類似,子數(shù)組里面的值為字符串拆分后的字母:
console.log(Object.entries("abc"))//[ [ '0', 'a' ], [ '1', 'b' ], [ '2', 'c' ] ]
padStart和padEnd
ES8中增加了 padStart 和 padEnd 方法,分別是對字符串的首尾進行填充的。
const message = "Hello World" const newMessage = message.padStart(15, "a") const newMessage1 = message.padEnd(15, "a") console.log(newMessage)//aaaaHello World console.log(newMessage1);//Hello Worldaaaa
列舉一個簡單的應(yīng)用場景:比如需要對身份證、銀行卡的前面位數(shù)進行隱藏
const cardNumber = “321324234242342342341312”
const lastFourCard = cardNumber.slice(-4)
const finalCard = lastFourCard.padStart(cardNumber.length, “*”)
console.log(finalCard)//********************1312
Trailing-Commas
允許我們在調(diào)用函數(shù)時,在最后一個參數(shù)后面加上逗號不會報錯。
ES9
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptor() 方法返回指定對象上一個自有屬性對應(yīng)的屬性描述符。(自有屬性指的是直接賦予該對象的屬性,不需要從原型鏈上進行查找的屬性)不存在則返回undefined
const object1 = { property1: 42 }; const descriptor1 = Object.getOwnPropertyDescriptor(object1, 'property1'); console.log(descriptor1.configurable); // true console.log(descriptor1.value); // 42
async、await的使用
由于該部分篇幅較多,所以以后會專門寫文章介紹其詳細使用的。
ES10
flat和flatMap的使用
flat:
flat會將數(shù)組中嵌套的子數(shù)組展開后放入最終的數(shù)組中,可以傳入數(shù)組表示可以展開數(shù)組的層數(shù),默認為1.例如:
const nums = [10, 20, [2, 9], [ [30, 40], [10, 45] ], 78, [55, 88] ] const newNums = nums.flat() console.log(newNums)//[ 10, 20, 2, 9, [ 30, 40 ], [ 10, 45 ], 78, 55, 88 ] const newNums2 = nums.flat(2) console.log(newNums2)//[ // 10, 20, 2, 9, 30, // 40, 10, 45, 78, 55, // 88 // ]
flatMap:
既有flat的效果,又有Array.map()的效果,傳入一個回調(diào)函數(shù),類似Array.map()的回調(diào)函數(shù),并且對返回的數(shù)值有flat的效果,例如:
const nums2 = [10, 20, 30] const newNums3 = nums2.flatMap(item => { return item * 2 })//[ 20, 40, 60 ]
應(yīng)用場景:將數(shù)組中的所有的字符串以某個符號分割后輸出:
const messages = ["Hello World", "hello cy", "my name is cy"] const words = messages.flatMap(item => { return item.split(" ") }) console.log(words) // [ // 'Hello', 'World', // 'hello', 'cy', // 'my', 'name', // 'is', 'cy' // ]
Object的fromEntries
可以將類似于對象經(jīng)過Object.entries轉(zhuǎn)化成的數(shù)組再轉(zhuǎn)化回對象形式:
let a = [ ['0', 'a'], ['1', 'b'], ['2', 'n'] ] const paramObj = Object.fromEntries(a) console.log(paramObj);//{ '0': 'a', '1': 'b', '2': 'n' }
trimStart和trimEnd
trim請除字符串前后的空格
trimStart清除字符串前面的空格
trimEnd清除字符串后面的空格
ES11
BigInt的使用
之前,JS所能表示的最大整數(shù)為Number.MAX_SAFE_INTEGER,為9007199254740991,比這個數(shù)還大,則可能在運算時出現(xiàn)錯誤,于是ES11后,推出了BigInt,用來表示可以超出限制的數(shù)字,BigInt數(shù)字末尾會加n,可以用Number(數(shù)字)將BigInt轉(zhuǎn)化成普通的數(shù)字類型。例子:
const bigInt = 900719925474099100n console.log(bigInt + 10n)//900719925474099110n const num = 100 console.log(bigInt + BigInt(num))//900719925474099200n const smallNum = Number(bigInt) console.log(smallNum)//900719925474099100
Nullish-Coalescing-operator
Nullish-Coalescing-operator空值合并運算,用雙問號表示(??):
如果??前面的值為空或者undefined,則最后的結(jié)果取問號后面的數(shù),例如:
const foo = undefined // const bar = foo || "default value" const bar = foo ?? "defualt value" console.log(bar)//defualt value
可選鏈
ES11提供了可選鏈(Optional Chainling),實例:
const info = {
name: “cy”,
// friend: {
// girlFriend: {
// name: “myj”
// }
// }
}
這是我們之前取值 info.friend.girlFriend的方法:if (info && info.friend && info.friend.girlFriend) {
console.log(info.friend.girlFriend.name)
}
可選鏈用法:info.friend ? .girlFriend ? .name
?前值為空或者undefined則不繼續(xù)取值,否則從當前繼續(xù)取值。
gloalThis
在瀏覽器運行環(huán)境下,window和全局作用域中的this均為全局對象。Node環(huán)境下是不行的,必須用global才可以拿到全局對象。
而ES11中的globalThis則在這2種情形下,都會指向全局對象。
ES12
finalizationRegistry的用法
finalizationRegistry是一個類,在注冊時候可以傳入一個回調(diào)函數(shù),注冊在finalRegistry的對象, 被銷毀時候會執(zhí)行回調(diào)函數(shù)。注冊的對象的register第一個參數(shù)傳入綁定的對象,第二個參數(shù)可以傳入?yún)?shù),這個參數(shù)會被回調(diào)函數(shù)接收。例子:
// ES12: FinalizationRegistry類 const finalRegistry = new FinalizationRegistry((value) => { console.log("注冊在finalRegistry的對象, 被銷毀", value) }) let obj = { name: "cy" } let info = { age: 18 } finalRegistry.register(obj, "obj") finalRegistry.register(info, "info") obj = null info = null //注冊在finalRegistry的對象, 被銷毀 info //注冊在finalRegistry的對象, 被銷毀 obj
WeakRef的使用
WeakRef是一個類,如果我們默認將一個對象賦值給另外一個引用,那么這個引用是一個強引用,但是如果我們希望是一個弱引用的話,可以使用WeakRef;
此時如果想拿到引用的對象的屬性,需要先調(diào)用deref函數(shù),例如:
let obj = { name: "cy" } let info = new WeakRef(obj) console.log(info.name); //undefined console.log(info.deref().name);//cy
這里要注意的是建立的是弱引用,如果將原先的引用破壞,則這個引用的對象會被回收,自然也拿不到值了。
let obj = { name: "cy" } let info = new WeakRef(obj) console.log(info.name); //undefined console.log(info.deref().name);//cy obj = null setTimeout(() => { console.log(info.deref() && info.deref().name)//undefined }, 10000)
logical-assign-operator
logical-assign-operator(邏輯運算擦操作符):
1. ||= 邏輯或賦值運算 let message = “hello world” message = message ||
“default value” 上面的式子可以簡寫成message ||= “default value”
2. &&= 邏輯與賦值運算 與邏輯或賦值運算用法同理
3. ??= 邏輯空賦值運算:let message = 0
message ? ? = “default value”,?前面的不是空或者undefined就等于后面的內(nèi)容
到此這篇關(guān)于一文概述ES7~12的語法及其相關(guān)使用規(guī)則的文章就介紹到這了,更多相關(guān)ES7~12的語法與使用規(guī)則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過js動態(tài)創(chuàng)建標簽,并設(shè)置屬性方法
下面小編就為大家分享一篇通過js動態(tài)創(chuàng)建標簽,并設(shè)置屬性方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02JS加密插件CryptoJS實現(xiàn)的Base64加密示例
這篇文章主要介紹了JS加密插件CryptoJS實現(xiàn)的Base64加密,結(jié)合實例形式分析了CryptoJS進行base64加密的簡單實現(xiàn)技巧,需要的朋友可以參考下2018-08-08javascript新建標簽,判斷鍵盤輸入,以及判斷焦點(示例代碼)
這篇文章主要介紹了javascript新建標簽,判斷鍵盤輸入,以及判斷焦點(示例代碼)。需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11JS+CSS實現(xiàn)帶關(guān)閉按鈕DIV彈出窗口的方法
這篇文章主要介紹了JS+CSS實現(xiàn)帶關(guān)閉按鈕DIV彈出窗口的方法,實例分析了div彈出層窗口的實現(xiàn)技巧,非常具有實用價值,具有一定參考借鑒價值,需要的朋友可以參考下2015-02-02