在1月的tc39議會確定下了ecmascript 2018的功能集
自tc39開始,ecmascript版本的重要性大大降低,重要的是提議的特性處於什麼樣的階段。只要進入第四階段就可以安全使用。即便如此,你在使用的時候最好還是檢查其相容性
主要特性
非同步函式迭代器
幾個新概念和實體
這部分涉及的比較多,具體內容參考:後面再單獨整理乙份。
展開/剩餘(rest/spread) 擴充套件特性
rest操作符用於物件結構賦值
// 用於陣列
const [...iterableobj] = [1, 3, 5, 7, 9];
[...iterableobj, 0, 2, 4, 6, 8];
// output
// [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
// 用於物件
const obj = ;
const = obj;
// output foo rest
// //
rest操作符也能收集其他引數
function func() ); // spread operator
return param1 + param2;
}
語法限制:結構時在物件的頂層只能使用乙個...rest操作符並且要放在最後spread操作符能夠將所有的可列舉屬性插入到新的物件中const = obj; // syntaxerror
const = obj; // syntaxerror
> const obj = ;
>
...rest和...spread常用在轉殖物件,合併操作等場景。如填充一些預設屬性
const defaults = ;
const userdata = ;
const data = ;
//
正則新特性
定義常量組名
在此之前,所有的分組是通過數字來實現的:第一組matchobj[1],第二組matchobj[2] etc
const re_date = /([0-9])-([0-9])-([0-9])/;
const matchobj = re_date.exec('1999-12-31');
const year = matchobj[1]; // 1999
const month = matchobj[2]; // 12
const day = matchobj[3]; // 31
通過數字分組有幾個缺點:
你要找到每組對應的結果很麻煩得去計算有幾個圓括號
如果你想知道每個組的意義你得去看正規表示式
如果你想改變順序還必須改正規表示式
現在,這些問題可以通過定義常量組名的方式來解決
通過名稱來識別組名
(?[0-9])
此處宣告了乙個year的組名,匹配成功之後我們就可以通過matchobj.groups.year
來訪問
const re_date = /(?[0-9])-(?[0-9])-(?[0-9])/;
const matchobj = re_date.exec('1999-12-31');
const year = matchobj.groups.year; // 1999
const month = matchobj.groups.month; // 12
const day = matchobj.groups.day; // 31
結合解構
const } = re_date.exec('1999-12-31');
console.log(year); // 1999
console.log(day); // 31
定義組名有幾個好處:
找到組的「id」更容易。
匹配的**變得自描述,因為組的id描述了捕獲的內容
如果更改捕獲組的順序,則不必更改匹配的**
捕獲組的名稱也使正規表示式更容易理解,因為您可以直接看到每個組的用途
利用replace實現格式化
console.log('1999-12-31'.replace(re_date,
(...args) => = args[args.length-1];
return month+'/'+day+'/'+year;
}));
// 12/31/1999
這裡的args包含a,y,m,d,groups
,這裡的groups是args的最後乙個引數,我們通過結構的方式訪問
等同於:
console.log('1999-12-31'.replace(re_date,
(a,y,m,d, ) => month+'/'+day+'/'+year)); // (a)
// 12/31/1999
unicode轉義特性
目前js可以通過字符集的名稱來匹配字元。如s代表空白
> /^\s+$/u.test('\t \n\r')
true
現在提議之後將可以實現通過unicode字元屬性來匹配字元。如
// 空白
> /^\p+$/u.test('\t \n\r')
true
// 希臘字母
> /^\p+$/u.test('μετά')
true
// 匹配拉丁字母
> /^\p+$/u.test('grüße')
true
// 匹配單獨的替代字元
> /^\p+$/u.test('\u')
true
後向斷言
前向斷言的意思的與當前位置之後的內容匹配
在前向斷言中接下來的任何東西都必須與斷言匹配,但是沒有其他事情發生。也就是說,沒有任何東西**獲,並且斷言對整個匹配的字串沒有貢獻。
const re_as_bs = /aa(?=bb)/;
這個表示式匹配的範圍是『aabb』,a後面必須是兩個b才能夠被匹配,但是結果並不包含b
後向斷言則與前向相反,是與當前位置之前的內容匹配。如
const re_dollar_prefix = /(?<=\$)foo/g;
'$foo %foo foo'.replace(re_dollar_prefix, 'bar');
// '$bar %foo foo'
正如你所看到的,『foo』只會在前面有乙個『$』符的時候才會被匹配
s(dotall)
目前正規表示式的.
有兩個限制。首先,它不符合非bmp字元,如表情符號
> /^.$/.test('')
false
當然,在目前的提議下可以同過unicode來實現
> /^.$/u.test('')
true
其次,點不匹配行結束符
> /^.$/.test('\n')
false
只能通過[^]
或者[\s\s]
來修復
> /^[^]$/.test('\n')
true
> /^[\s\s]$/.test('\n')
true
建議之後引入了新的修飾符/s
(簡稱:singleline)能夠匹配行結束符
> /^.$/s.test('\n')
true
其他
promise.prototype.finally()
promise
.then(result => )
.catch(error => )
.finally(() => );
finally
回掉會一直執行;then
回掉僅僅是在promisefulfilled
的時候執行;catch
毀掉僅僅是在promiserejected
或者then
回掉拋異常的時候執行。常見的場景如:
let connection;
db.open()
.then(conn => );
}).then(result => )
···.catch(error => )
.finally(() => );
模板字串修正
該建議是為了讓標籤模板中的語法更加自由。string.raw()是乙個模板字串的標籤函式,它的作用類似於 python 中的字串字首r
和 c# 中的字串字首@
,是用來獲取乙個模板字串的原始字面量值的。在接受模板字串的時候會解析為兩個版本:
即使使用raw版本,你也沒有太多的自由。因為多了反斜槓之後就不合法了:
ECMAScript 新的資料結構Set
一 ecmascript 新的資料結構set 1.一種新的資料結構結構類似於陣列,但是成員的值都是唯一的,沒有重複的值。let s newset 1,2,3,2 console.log s set 3 2.常用方法 add let s newset 1,2,3 s.add test console....
ECMAScript 新的資料結構Map
一 ecmascript 新的資料結構set 1.一種新的資料結構結構類似於物件,鍵值對的集合。map 結構提供了 值 值 的對應,是一種更完善的 hash 結構實現。let m newmap let obj m.set zhangsan obj 2.常用方法 新增 let m newmap let...
ECMAScript6 新特性 「正則的擴充套件」
es6 允許regexp建構函式接受正規表示式作為引數。第二個引數指定修飾符,如果存在則使用指定的修飾符。var regexp new regexp xyz i,ig console.log regexp.flags gi字串物件的4個使用正規表示式的方法 match replace search ...