JS_ES6、ES7、ES8、ES9、ES10的新增方法
技術標籤:# JS
ES6(2015)
模組化(Module)
ES5不支援原生的模組化,在ES6中模組作為重要的組成部分被新增進來。模組的功能主要由 export 和 import 組成。每一個模組都有自己單獨的作用域,模組之間的相互呼叫關係是通過 export 來規定模組對外暴露的介面,通過import來引用其它模組提供的介面。同時還為模組創造了名稱空間,防止函式的命名衝突。
匯出(export)
//匯出變數
export var name = 'xw'
var name = 'xw';
var age = '20';
export {name, age};
//匯出常量
export const msg = 'msg';
//匯出函式
export function myModule(name) {
return name;
}
匯入(import)
import {myModule} from 'myModule';
import {name,age} from 'test';
//一條import 語句可以同時匯入預設函式和其它變數。
import defaultMethod, { otherMethod } from 'xxx.js';
Set
建立類似陣列的資料結構,但成員是唯一(無重複)
let set = Set() // 建立
let set = Set([1,2]) // 建立(通過陣列)
set.size // 成員數
set.has(value) // 是否存在
set.add(value) // 新增
set.delete(value) // 刪除
set.clear() // 清除
set.keys(); // SetIterator {"a", "b", "c"}
set.values(); // 同上
set.entries(); // 同上
set. forEach(item=>{});
Map
任何型別資料都可以當成key
let m = new Map();
let map = new Map([['k1','v1'],['k2','v2'],['k3','v3']])
map.size
map.has('key')
map.set('key','value')
map.get('key')
m.delete('key')
m.clear()
map.keys()
map.values()
map.entries()
map.forEach((value,key,map)=>{})
箭頭函式
這是ES6中最令人激動的特性之一。=>不只是關鍵字function的簡寫,它還帶來了其它好處。箭頭函式與包圍它的程式碼共享同一個this,能幫你很好的解決this的指向問題。有經驗的JavaScript開發者都熟悉諸如var self = this;或var that = this這種引用外圍this的模式。但藉助=>,就不需要這種模式了。
箭頭函式的箭頭=>之前是一個空括號、單個的引數名、或用括號括起的多個引數名,而箭頭之後可以是一個表示式(作為函式的返回值),或者是用花括號括起的函式體(需要自行通過return來返回值,否則返回的是undefined)。
let fun = a=>{return a}
let fun = ()=>{
return 0;
}
let fun = (a,b)=>{
return a+b;
}
預設引數
const test = (a='a',b='b',c='c')=>{
return a+b+c
}
console.log(test('A','B','C')) //ABC
console.log(test('A','B')) //ABc
console.log(test('A')) //ABc
模板字串
//不使用模板字串:
var name = 'Your name is ' + first + ' ' + last + '.'
var name = `Your name is ${first} ${last}.`
結構賦值
陣列的結構賦值
var foo = ["one", "two","three","four"];
var [one, two, three] = foo;
console.log(one); // "one"
console.log(two); // "two"
console.log(three); // "three"
//如果你要忽略某些值,你可以按照下面的寫法獲取你想要的值
var [first, , , last] = foo;
console.log(first);// "one"
console.log(last); // "four"
//你也可以這樣寫
var a, b; //先宣告變數
[a, b] = [1,2];
console.log(a); // 1
console.log(b); // 1
//利用結構賦值交換兩個變數的值。
var a = 1;
var b = 3;
[a, b] = [b, a];
console.log(a);// 3
console.log(b);// 1
物件的結構賦值
const student = {
name:'Ming',
age:'18',
city:'Shanghai'
}
const {name,age,city} = student;
console.log(age); // "18"
console.log(city);// "Shanghai"
延展操作符(Spread operator)
var arr1 = [0,1,2];
var arr2 = [3,4,5];
var arr3 = [...arr1, ...arr2]; //[0,1,2,3,4,5]
//等同於 var arr4 = arr1.concat(arr2);
var obj1 = {
foo: 'bar',
x:42
};
var obj2 = {
foo:'baz',
y:13
};
var obj3 = { ...obj1 }; // 克隆後的物件: { foo: "bar", x: 42 }
var obj4 = { ...obj1, ...obj2 }; // 合併後的物件: { foo: "baz", x: 42, y: 13 }
Promise
var test = (a,b)=>{
return new Promise((reslove,reject)=>{
//非同步操作
reslove(resoult)//返回正確結果
reject(err) //出錯時的結果
})
}
//使用
test(a,b).then(res=>{
//...promise reslove()返回正確結果後執行到這裡
}).catch(err=>{
//前面reject(err)後代碼會執行到裡
})
//或者
try{
var resoult = await test(a,b)
//...
}
catch(err){
//...
}
ES7新特性(2016)
includes()
includes() 函式用來判斷一個數組是否包含一個指定的值,如果包含則返回 true,否則返回false。
語法:array.includes(value,index),其中value為查詢的值,index表示從此下標開始查詢
let arr = ['react','angular','vue'];
if (arr.includes('react')){
console.log('react存在');
}
var arr=['a','b','c'];
arr.includes('a')//------------------返回true
arr.includes('a',1)//----------------返回false
arr.includes('b',1)//-----------------返回true
指數運算子**
在ES7中引入了指數運算子**,**具有與Math.pow(…)等效的計算結果
// es6
console.log(Math.pow(2,10));//2 的 10次方 1024
// es7
console.log(2 ** 10) // 1024
ES8新特性(2017)
async/await
async function process(array) {
for await (let i of array) {
doSomething(i);
}
}
Object.values()
const obj = {
a:1,
b:2,
c:3
};
const values= Object.values(obj);
console.log(values);//[1, 2, 3]
Object.entries()
Object.entries()函式返回一個給定物件自身可列舉屬性的鍵值對的陣列。
這個真的很有用。之前為了遍歷key和value搞得很煩。
for(let [key,value] of Object.entries(obj1)){
console.log(`key: ${key} value:${value}`)
}
//key:a value:1
//key:b value:2
//key:c value:3
String padding
String.padStart(targetLength,[padString])
String.padEnd(targetLength,padString])
targetLength:當前字串需要填充到的目標長度。如果這個數值小於當前字串的長度,則返回當前字串本身。
padString:(可選)填充字串。如果字串太長,使填充後的字串長度超過了目標長度,則只保留最左側的部分,其他部分會被截斷,此引數的預設值為 " "。
console.log('0.0'.padStart(4,'*'))
console.log('0.0'.padStart(20))
console.log('0.0'.padEnd(4,'*'))
console.log('0.0'.padEnd(10,'*'))
/*
*0.0
0.0
0.0*
0.0*******
*/
Object.getOwnPropertyDescriptors()
const obj2 = {
name: 'Jine',
get age() {
return '18'
}
};
Object.getOwnPropertyDescriptors(obj2)
// age: {
// configurable: true,
// enumerable: true,
// get: function age(){}, //the getter function
// set: undefined
// },
// name: {
// configurable: true,
// enumerable: true,
// value:"Jine",
// writable:true
// }
// }
SharedArrayBuffer物件
有了 SharedArrayBuffer 後,多個 web worker 就可以同時讀寫同一塊記憶體了你再也不需要 postMessage 伴有時延的通訊了,多個 web worker 對資料訪問都沒有時延了
SharedArrayBuffer 物件用來表示一個通用的,固定長度的原始二進位制資料緩衝區,類似於 ArrayBuffer 物件,它們都可以用來在共享記憶體(shared memory)上建立檢視。與 ArrayBuffer 不同的是,SharedArrayBuffer 不能被分離。
/***
* @param {*} length 所建立的陣列緩衝區的大小,以位元組(byte)為單位。
* @returns {SharedArrayBuffer} 一個大小指定的新 SharedArrayBuffer 物件。其內容被初始化為 0。
*/
new SharedArrayBuffer(length)
Atomics物件
Atomics 物件提供了一組靜態方法用來對 SharedArrayBuffer 物件進行原子操作。
這些原子操作屬於 Atomics 模組。與一般的全域性物件不同,Atomics 不是建構函式,因此不能使用 new 操作符呼叫,也不能將其當作函式直接呼叫。Atomics 的所有屬性和方法都是靜態的(與 Math 物件一樣)。
多個共享記憶體的執行緒能夠同時讀寫同一位置上的資料。原子操作會確保正在讀或寫的資料的值是符合預期的,即下一個原子操作一定會在上一個原子操作結束後才會開始,其操作過程不會中斷。
Atomics.add()
//將指定位置上的陣列元素與給定的值相加,並返回相加前該元素的值。
Atomics.and()
//將指定位置上的陣列元素與給定的值相與,並返回與操作前該元素的值。
Atomics.compareExchange()
//如果陣列中指定的元素與給定的值相等,則將其更新為新的值,並返回該元素原先的值。
Atomics.exchange()
//將陣列中指定的元素更新為給定的值,並返回該元素更新前的值。
Atomics.load()
//返回陣列中指定元素的值。
Atomics.or()
//將指定位置上的陣列元素與給定的值相或,並返回或操作前該元素的值。
Atomics.store()
//將陣列中指定的元素設定為給定的值,並返回該值。
Atomics.sub()
//將指定位置上的陣列元素與給定的值相減,並返回相減前該元素的值。
Atomics.xor()
//將指定位置上的陣列元素與給定的值相異或,並返回異或操作前該元素的值。
//wait() 和 wake() 方法採用的是 Linux 上的 futexes 模型(fast user-space mutex,
//快速使用者空間互斥量),可以讓程序一直等待直到某個特定的條件為真,主要用於實現阻塞。
Atomics.wait()
//檢測陣列中某個指定位置上的值是否仍然是給定值,是則保持掛起直到被喚醒或超時。
//返回值為 "ok"、"not-equal" 或 "time-out"。呼叫時,如果當前執行緒不允許阻塞,則會丟擲異常
//(大多數瀏覽器都不允許在主執行緒中呼叫 wait())。
Atomics.wake()
//喚醒等待佇列中正在陣列指定位置的元素上等待的執行緒。返回值為成功喚醒的執行緒數量。
Atomics.isLockFree(size)
//可以用來檢測當前系統是否支援硬體級的原子操作。對於指定大小的陣列,如果當前系統支援硬體級的原子操作,
//則返回 true;否則就意味著對於該陣列,Atomics 物件中的各原子操作都只能用鎖來實現。此函式面向的是技術專家。
ES9新特性(2018)
非同步迭代
ES2018引入非同步迭代器(asynchronous iterators),這就像常規迭代器,除了next()方法返回一個Promise。因此await可以和for…of迴圈一起使用,以序列的方式執行非同步操作。例如:
async function process(array) {
for await (let i of array) {
doSomething(i);
}
}
Promise.finally()
一個Promise呼叫鏈要麼成功到達最後一個.then(),要麼失敗觸發.catch()。在某些情況下,你想要在無論Promise執行成功還是失敗,執行相同的程式碼,例如清除,刪除對話,關閉資料庫連線等。
function doSomething() {
doSomething1()
.then(doSomething2)
.then(doSomething3)
.catch(err => {
console.log(err);
}).finally(() => {
// finish here!
});
}
正則表示式命名捕獲組
const reDate = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/,
match = reDate.exec( '2018-04-30'),
year = match.groups.year,
// 2018
month = match.groups.month,
// 04
day = match.groups.day;
// 30
const reDate = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/,
d = '2018-04-30',
usDate = d.replace(reDate, '$<month>-$<day>-$<year>');
ES10新特性(2019)
新增了Array的flat()方法和flatMap()方法
flat() 方法會按照一個可指定的深度遞迴遍歷陣列,並將所有元素與遍歷到的子陣列中的元素合併為一個新陣列返回。
flat()方法最基本的作用就是陣列降維
其次,還可以利用flat()方法的特性來去除陣列的空項
var arr1 = [1,2, [3,4]];
arr1.flat();
// [1, 2, 3, 4]
var arr2 = [1,2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]
var arr3 = [1,2, [3,4, [5,6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
//使用 Infinity 作為深度,展開任意深度的巢狀陣列
arr3.flat(Infinity);
// [1, 2, 3, 4, 5, 6]
//去除空項
var arr4 = [1, 2, ,4,5];
arr4.flat();
// [1, 2, 4, 5]