try...catch(e)...
简化try...catch(e)...
其中e
变成可选,不需要再额外处理
jstry {
throw new Error(1);
} catch {
console.log('报错了!');
}
Symbol([description])
可获取描述增加获取descruption
描述的属性descruption
jslet sb = Symbol('symbol');
console.log(sb.description);//symbol
Object.fromEntries(iterable)
Object.fromEntries(iterable)
将键值对列表转换成一个对象,iterable
可为Array,Map
以及其它可迭代对象
jsconst myMap = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(Object.fromEntries(myMap));//{ key1: 'value1', key2: 'value2' }
jslet oneArr = [['key1', 'value1'], ['key2', 'value2']];
console.log(Object.fromEntries(oneArr));//{ key1: 'value1', key2: 'value2' }
Object.entries()
与object.fromEntries()
相反
jslet obj = { key1: 'value1', key2: 'value2' }
console.log(Object.entries(obj));//[[ 'key1', 'value1' ], [ 'key2', 'value2' ]]
Array.flat(num)
Array.flat(num)
多维数组拍平,num
表示拍平几维数组,传入infinity
无论多少维都会被拍平,num
默认为1
jslet arr = [['key1', 'value1'], ['key2', 'value2']];
console.log(arr.flat(),arr);//[ 'key1', 'value1', 'key2', 'value2' ] [[ 'key1', 'value1' ], [ 'key2', 'value2' ]]
jslet arr = [['key1', 'value1'], ['key2', 'value2', ['key3', 'value3']]];
console.log(arr.flat());[ 'key1', 'value1', 'key2', 'value2', [ 'key3', 'value3' ] ]
console.log(arr.flat(2));//[ 'key1', 'value1', 'key2', 'value2', 'key3', 'value3' ]
jslet arr = [['key1', 'value1'], ['key2', 'value2', ['key3', 'value3']]];
console.log(arr.flat(Infinity));//[ 'key1', 'value1', 'key2', 'value2', 'key3', 'value3' ]
Array.flatMap()
Array.flatMap()
等价于Array.map(val=>[val*2]).flat()
jslet arr = [1,2,3];
console.log(arr.flatMap(val => val * 2));//[ 2, 4, 6 ]
//当数组结构层次为1时,flatMap与map方法一致
console.log(arr.map(val=>val*2));//[ 2, 4, 6 ]
jslet arr = [1,2,3];
let arr = [1, 2, 3];
console.log(arr.map(val => [val * 2]));//[ [ 2 ], [ 4 ], [ 6 ] ]
//flatMap
console.log(arr.flatMap(val => [val * 2]));//[ 2, 4, 6 ]
String.trimStart()
与String.trimEnd()
trimLeft,trimRight
分别是trimStart,trimEnd
的别名,作用为删除字符串开头或结尾的空格
jslet str1 = ' 2',
str2 = '2 '
console.log(str1.trimStart());//"2"
console.log(str1.trimLeft());//"2"
console.log(str2.trimEnd());//"2"
console.log(str2.trimRight());//"2"
globalThis
浏览器全局环境是window
,nodeJs全局环境是global
; ES2020增加globalThis
,统一nodeJS与浏览器全局对象
浏览器环境
jswindow === globalThis;//true
nodeJs环境
jsglobal === globalThis;//true
?.
我愿称之为最强
jsglobalThis.a ? globalThis.a() : null;
判断a
函数是否存在,存在则执行;
不了解决?.
前,实际开发用三元运算,知道后?.
一把梭
jsglobalThis.a?.();
jslet obj = {
name:'js',
age:25,
sex:'male'
}
let sex = obj?.sex;//相当于 let sex = obj?obj.sex:undefined;
import
引入该特性出来前,使用import
加载文件,必须声明在文件最上层;对执行过程中无法通过判断来是否加载import
引入的模块,做不到按需加载。
js//报错!
if(a){
import './...';
}
动态引入 ,动态引入会返回一个promise
jsif(a){
import('./..').then(res=>{
//...
})
}
当然可能使用await
,**新特性中await
**可以在单独使用,不一定要嵌套在async
下
jsif(a){
await import('./..');
}
BigInt
允许超出安全数字范围Math.pow(2,53) - 1
jsconst previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);//9007199254740991n
const maxPlusOne = previousMaxSafe + 1n;//9007199254740992n
??
当左侧为null
或undefined
时,返回右侧值
jslet value = globalThis.value ?? 1;
console.log(value);//1
jslet value = 0 ?? 1;
console.log(value);//0
_
分隔jslet value = 1_000_000;
console.log(value);//1000000
??=,||=,&&=
当左侧为null或undefined
时对其赋值,||=,&&=
同理
jslet a;
a??=1; // 当a为null或undefined时,a被赋值为1
console.log(a);//1
String.prototype.replaceAll()
替换全部js'1 2 3 1'.replace('1','2');//"2 2 3 1"
'1 2 3 1'.replaceAll('1','2')//"2 2 3 2"
Promise.any()
Promise.any()
浏览器暂未全部支持,已列案(TC39 第四阶段草案)
Promise.any()
接收一个Promise
可迭代对象,只要其中的一个 promise
成功,就返回那个已经成功的 promise
jsconst promise1 = new Promise((resolve,reject)=>{
reject(1);
})
const promise2 = new Promise((resolve,reject)=>{
reject(2);
})
const promise3 = new Promise((resolve,reject)=>{
reject(3);
})
Promise.any([promise1,promise2,promise3]).then(res=>{
console.log('有promise已成功!');
})
class
增加定义私有类字段定义私有方法,私有字段,使用#
作为前缀
jsclass Person{
//私有方法
#getAge(){
return this.age;
}
}
期待各位同学指点补充!
觉得文章有用的同学点赞一波!
解读ES2020(ES11)新特性 - 简书 (jianshu.com)
本文作者:凌览
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!