ECMAScript語言規(guī)范的第10個版本發(fā)布(ES2019)。來看看怎么使用它們。
String.prototype.trimStart() / String.prototype.trimEnd()
在接收用戶輸入的文本,我們經(jīng)常會把頭尾的空格文本去掉,來規(guī)避展示的不受控情況。自ES5來,String.prototype.trim() 被用于去除頭尾上的空格、換行符等,現(xiàn)在通過 trimStart(),trimEnd() 來頭和尾進行單獨控制。trimLeft()、trimRight() 是他們的別名。
const string = ' Hello ES2019! ';
string.trimStart(); // 'Hello ES2019! '
string.trimEnd(); // ' Hello ES2019!'
可以大膽想象一下,未來是不是可以通過傳入指定字符串參數(shù)來對頭尾進行刪減。
Object.fromEntries()
ES8為我們引入了Object.entries把一個對象轉(zhuǎn)為[key, value]鍵值對的形式,可以運用于像 Map 這種結(jié)構(gòu)中。凡事有來有回,Object.fromEntries()用于把鍵值對還原成對象結(jié)構(gòu)。
const entries = [ ['foo', 'bar'] ];
const object = Object.fromEntries(entries); // { foo: 'bar' }
Array.prototype.flat() / Array.prototype.flatMap()
把數(shù)組展平是Array原型給我們帶來的新特性,通過傳入層級深度參數(shù)(默認為1),來為下層數(shù)組提升層級。如果想提升所有層級可以寫一個比較大的數(shù)字甚至是Infinity,當然不推薦這么做。
[1, 2, [3, 4]].flat(); // [ 1, 2, 3, 4 ]
[1, 2, [3, 4, [5, 6]]].flat(2); // [ 1, 2, 3, 4, 5, 6 ]
Array.prototype.flatMap() 它是 Array.prototype.map() 和Array.prototype.flat()的組合,通過對map調(diào)整后的數(shù)據(jù)嘗試展平操作。
[1, 2, [3, 4]].flatMap(v => {
if (typeof v === 'number') {
return v * 2
} else {
return v.map(v => v * 2)
}
})
// [2, 4, 6, 8]
catch 的參數(shù)改為可選
在進行 try...catch 錯誤處理過程中,如果沒有給catch傳參數(shù)的話,代碼就會報錯。有時候我們并不關(guān)心錯誤情況,如:
const isValidJSON = json => {
try {
JSON.parse(json);
return true;
} catch (unusedError) {
// Unused error parameter
return false;
}
};
在新規(guī)范中,我們可以省略catch綁定的參數(shù)和括號。
const isValidJSON = json => {
try {
JSON.parse(json);
return true;
} catch {
return false;
}
};
Symbol.description
Symbol 是ES6中引入的基本數(shù)據(jù)類型,可以用作對象屬性的標識符。描述屬性是只讀的,可用于獲取符號對象的描述,更好了解它的作用。
const symbol = Symbol('This is a Symbol');
symbol; // Symbol(This is a Symbol)
Symbol.description; // 'This is a Symbol'
JSON Superset 超集
之前如果JSON字符串中包含有行分隔符(\u2028) 和段落分隔符(\u2029),那么在解析過程中會報錯。
JSON.parse('"\u2028"'); // SyntaxError
現(xiàn)在ES2019對它們提供了支持。
JSON.parse('"\u2028"'); // ''
JSON.stringify() 加強格式轉(zhuǎn)化
我們看一下熟知的emoji表現(xiàn):
'??'.length; // 2
JavaScript將emoji解釋為兩個字符的原因是UTF-16將emojis(以及其他不尋常的字符)表示為兩個代理項的組合。我們的emoji用字符'\uD83D'和'\uDE0E'編碼。但是如果試圖單獨編寫這樣一個字符,例如'\uD83D',則會認為這是一個無效的文本字符串。在早期版本中,這些字符將替換為特殊字符:
JSON.stringify('\uD83D'); // '"?"'
現(xiàn)在在字符代碼之前插入轉(zhuǎn)義字符,結(jié)果仍是可讀且有效的UTF-8/UTF-16代碼:
JSON.stringify('\uD83D'); // '"\\ud83d"'
Array.prototype.sort() 更加穩(wěn)定
之前,規(guī)范允許不穩(wěn)定的排序算法,如快速排序。
let array = [
{a: 1, b: 2},
{a: 2, b: 2},
{a: 1, b: 3},
{a: 2, b: 4},
{a: 5, b: 3}
];
array.sort((a, b) => a.a - b.a);
// [{a: 1, b: 2}, {a: 1, b: 3}...] / [{a: 1, b: 3}, {a: 1, b: 2}...]
在之前的排序中,可能出現(xiàn) [{a: 1, b: 2}, {a: 1, b: 3}...]、[{a: 1, b: 3}, {a: 1, b: 2}...] 等多種情況。
現(xiàn)在所有主流瀏覽器都使用穩(wěn)定的排序算法。實際上,這意味著如果我們有一個對象數(shù)組,并在給定的鍵上對它們進行排序,那么列表中的元素將保持相對于具有相同鍵的其他對象的位置。
Function.prototype.toString() 重新修訂
從ES2019開始,Function.prototype.toString()將從頭到尾返回源代碼中的實際文本片段。這意味著還將返回注釋、空格和語法詳細信息。
function /* a comment */ foo() {}
之前,Function.prototype.toString()只會返回了函數(shù)的主體,但沒有注釋和空格。
foo.toString(); // 'function foo() {}'
但現(xiàn)在,函數(shù)返回的結(jié)果與編寫的一致。
foo.toString(); // 'function /* a comment */ foo () {}'
參考資料
合集
- ES2021(ES12)新特性解讀
- ES2020(ES11)帶來的新特性
- ES2019(ES10)帶來的9個新特性
- ES2018(ES9)新特性
- ES2017(ES8)新特性
- ES2016(ES7)新特性