ES6(2015)class(类)classMan{constructor(name){this.name='小豪';}console(){console.log(this.name);}}constman=newMan('小豪');man.console();//小豪模块化(ESModule)//模块A导出一个方法exportconstsub=(a,b)=>a+b;//模块B使用import{sub}from'./A'导入;控制台日志(子(1、2));//3箭头(Arrow)函数constfunc=(a,b)=>a+b;函数(1,2);//3个函数参数默认值functionfoo(age=25,){//...}templatestringconstname='小豪';conststr=你的名字是${name};解构赋值leta=1,b=2;[a,b]=[b,a];//a2b1扩展运算符leta=[...'helloworld'];//["h","e","l","l","o","","w","o","r","l","d"]对象属性简写constname='小豪';constobj={name};PromisePromise.resolve().then(()=>{console.log(2);});控制台。log(1);//先打印1,再打印2letandconstletname='Xiaohao';constarr=[];ES7(2016)Array.prototype.includes()[1].includes(1);//真指数运算符2**10;//1024ES8(2017)async/await//异步终极解决方案asyncgetData(){constres=awaitapi.getTableData();//等待异步任务//做一些事情}Object.values()Object.values({a:1,b:2,c:3});//[1,2,3]Object.entries()Object.entries({a:1,b:2,c:3});//[["a",1],["b",2],["c",3]]字符串填充//padStart'hello'.padStart(10);//"hello"//padEnd'hello'.padEnd(10)"hello"函数参数列表的末尾允许逗号EmptyobjectSharedArrayBufferobjectSharedArrayBufferobject用于表示一个普通的、固定长度的原始二进制数据缓冲区,/****@param{*}length创建的数组缓冲区的大小,以字节(byte)为单位。*@returns{SharedArrayBuffer}指定大小的新SharedArrayBuffer对象。它的内容被初始化为0。*/newSharedArrayBuffer(10)Atomics对象Atomics对象提供了一组静态方法,用于对SharedArrayBuffer对象执行原子操作。ES9(2018)异步迭代await可以和for...of循环一起使用,串行运行异步操作asyncfunctionprocess(array){forawait(letiofarray){//doSomething(i);}}Promise.finally()Promise.resolve().then().catch(e=>e).finally();Rest/Spread属性const值=[1,2,3,5,6];console.log(Math.max(...values));//6个正则表达式命名为捕获组constreg=/(?[0-9]{4})-(?[0-9]{2})-(?[0-9]{2})/;constmatch=reg.exec('2021-02-23');ES10(2019)Array.flat()和Array.flatMap()flat()[1,2,[3,4]].flat(Infinity);//[1,2,3,4]flatMap()[1,2,3,4].flatMap(a=>[a**2]);//[1,4,9,16]String.trimStart()和String.trimEnd()去除字符串开头和结尾的空白字符String.prototype.matchAllmatchAll()为所有匹配返回一个匹配对象Iteratorconstraw_arr='test1test2test3'.matchAll((/t(e)(st(\d?))/g));constarr=[...raw_arr];在此处插入图片描述Symbol.prototype.description一个只读属性,返回Symbol对象的可选描述字符串。符号('描述')。描述;//'description'Object.fromEntries()返回给定对象本身的可枚举属性的键值对数组//通过Object.fromEntries,Map可以转换为Object:constmap=newMap([['foo','bar'],['baz',42]]);安慰。日志(对象。来自条目(地图));//{foo:"bar",baz:42}OptionalCatchES11(2020)NullishcoalescingOperator(nullvalueprocessing)expressionontheleftsideof??运算符的计算结果为undefined或null,返回其右侧。让user={u1:0,u2:false,u3:null,u4:undefinedu5:'',}让u2=user.u2??'用户2'//falseletu3=user.u3??'用户3'//用户3让u4=user.u4??'用户4'//用户4让u5=user.u5??'User5'//''Optionalchaining(可选链接)?.用户检测不确定中间节点letuser={}letu1=user.childer.name//TypeError:Cannotreadproperty'name'ofundefinedletu1=user.childer?.name//undefinedPromise.allSettled返回一个已解决的承诺在所有给定的promise或被拒绝后resolved的promise,带有一个对象数组,每个对象代表对应的promise结果constpromise1=Promise.resolve(3);constpromise2=42;constpromise3=newPromise((resolve,reject)=>reject('我是失败的Promise_1'));constpromise4=newPromise((resolve,reject)=>reject('我是失败的Promise_2'));constpromiseList=[promise1,promise2,promise3,promise4]Promise.allSettled(promiseList).then(values=>{console.log(values)});import()导入新的原始数据类型BigInt任意精度整数globalThis浏览器:windowworker:selfnode:globalES12(2021)replaceAll返回一个全新的字符串,所有匹配的字符都会被替换conststr='helloworld';str.replaceAll('l','');//"heoword"Promise.anyPromise.any()接收一个Promise可迭代对象,只要其中一个promise成功,就返回成功的promise如果可迭代对象是如果没有一个promises成功(即所有promises都失败)/reject),返回失败的承诺constpromise1=newPromise((resolve,reject)=>reject('我是失败的Promise_1'));constpromise2=newPromise((resolve,reject)=>reject('我失败了Promise_2'));constpromiseList=[promise1,promise2];Promise.any(promiseList).then(values=>{console.log(values);}).catch(e=>{console.log(e);});WeakRefs使用Wea??kRefs的Class类创建对象的弱引用(对象的弱引用是指当对象应该被GC回收时,不会阻止GC回收行为)逻辑运算符和赋值表达式逻辑运算符和赋值表达式,新特性结合了逻辑运算符(&&、||、??)和赋值表达式,JavaScript现有的复合赋值运算符是:a||=b//等价于a=a||(a=b)a&&=b//等价于a=a&&(a=b)a??=b//等价于a=a??(a=b)numberseparator数字分隔符,可以在数字之间创建一个可视化的分隔符,使用_下划线分隔数字,使数字更具可读性constmoney=1_000_000_000;//相当于constmoney=1000000000;1_000_000_000===1000000000;//真的