现代JavaScript:ES6+中的ImportsExportsLetConst和Promise讲义_第1页
现代JavaScript:ES6+中的ImportsExportsLetConst和Promise讲义_第2页
现代JavaScript:ES6+中的ImportsExportsLetConst和Promise讲义_第3页
现代JavaScript:ES6+中的ImportsExportsLetConst和Promise讲义_第4页
现代JavaScript:ES6+中的ImportsExportsLetConst和Promise讲义_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在过去几年里,JavaScript有很多的更新。如果你想提升写代码的能力,这些更新将会对你有非常大的帮助。对于程序员来说,了解这门语言的最新发展是非常重要的。它能使你跟上最新趋势,提高代码质量,在工作中出类拔萃,从而进一步提升你的薪资待遇。特别地,如果你想学习像React、Angular或Vue这样的框架,你必须掌握这些最新的特性。最近,JavaScript增加了许多有用的功能,Nullishcoalescingoperator,optionalchaining.Promises,async/await,ES6destructuring,等等。那么现在,我们将探讨每个JavaScript开发者都应该知道的概念。JavaScript中的Let和const在ES6之前,JavaScript使用var关键字来声明变量,var只有全局作用域和函数作用域,所谓全局作用域就是在代码的任何位置都能访问var声明的变量,而函数作用域在变量声明的当前函数内部访问变量。此时是没有块级作用域的。随着let和const这两个关键字的添加,JS增加了块级作用域的概念。如何在JavaScript中使用let当我们在用let声明变量时,用于声明一次之后就不能再以相同的名称重新声明它。//ESSCodevavvalue=工。con$oledog(value);//tovarvalue="hell。";consote.log(value);//hellovarvalue=30;console.log^alue);//30如上所示,我们多次使用var关键字重新声明了变量值。在ES6之前,我们可以使用var重新声明之前已经声明过的变量,这就会导致了一个问题:如果我们在不知情的情况下,在其他地方重新声明了该变量,很有可能会覆盖原先变量的值,造成一些难以调试的问题。所以,Let解决很好地解决此问题。当你使用let重新声明变量值时,将会报错。//ES6Codeletvalue=console.log(valbie);//t-Oletvalue=,lMlou;//UMauglatSyiataxError:Identifier'value'hasalreadybeendeclared但是,以下代码是合法的://ES6Codeletvalue=XO,comole.log^alue),//工。value="hello";co^ole.logCvalue),//hello我们发现上面的代码看起来没什么问题,是因为我们重新给value变量赋了一个新值,但是并没有重新声明。我们来看下下面的代码://ES5Codevari$Valid=true;if(i^Valid){var =W;consoleJog。inside:',nuFwfeer);//inside:IO}co^ole.log('outride:1j八ukube。//outside:XO如上所示,在使用var声明变量时,可以在if块之外访问该变量。而使用let声明的number变量只能在if块内访问,如果在if块外访问将会报错。我们来看下接下来的代码//ES6Codeletinvalid=true;if(i$Valid){let^.ui^ber-W;console.logCinsi-nukwber);//inside:XO^oiasole.logCoutside:1jnumber);//UncaughtReferenceError:nukvxfeerisMtdefied如上述代码所示,使用let分别在if块内、if块外声明了number变量。在if块外,number无法被访问,因此会出现引用错误。但是,如果变量number在if块外已经声明,将会出现下面的结果。//ES6CodeletisValid=truejetnuwfeer=20;if(isValid){let八"Mber=W;co八soleJog。inside:',n.uFv\ber);//Mside:IO}console.logCoutside:1,nunAber);//outside:2.0现在在单独的范围内有两个number变量。在if块外,number的值为20。//ES5 i=。;i<工。i++){consote.log(i);ycoi^sole.logCoutside:'ji);//XO当使用var关键字时,i在for循环之外也可以访问至ij。//ES6Codefor(leti-O;i<20;i++){console.log(i);console.logCoutside:',i);//UncaughtReferenceError:iisnotdefined而使用let关键字时,在for循环外部是不可访问的。因此,正如上述示例代码所示,let声明的变量只能在块内部可用,而在块外部不可访问。我们可以使用一对大括号创建一个块,如下:leti=leti=20;console.logCinside:1,i);//inside:2.0=3(9;con$ole>.log('iagaiiai'ji);//iagain:"50]console.logCoutside:1ji);//outside:IO前面有提到,let在同一个块中不能重新声明变量,不过可以在另一个块中重新声明。如上代码所示,我们在块内重新声明了i,并赋值20,该变量仅可在该块中使用。在块外,当我们打印变量时,我们得到的是10而不是之前分配的值,这是因为块外,内部变变量i是不存在的。如果在块外未声明变量,那么将会报错:(leti=26code.logC沁i-i);//inside:2.0i=3(2;console.logCiagain:1,i);//iagai^:"50}co^oledogCoutside:',i);//UncaugktReferenceError:iisnotdefined如何在JavaScript使用constconst关键字在块级作用域中的工作方式与let关键字完全相同。因此,我们来看下他们的区别。const声明的变量为常量,其值是不能改变的。而let声明的变量,可以为其赋一个新值,如下所示:letnumber-工。;八〃叱区匕=2。conso/e./ogSuMber);//2.0但是以下情况,我们不能这样使用constoconstnumber=Wjnuwfaer=2-0,//UMaughtTypeError:Assigi^^enttoconstantvariable.我们甚至不能使用const像下面一样重新声明。constnukvxber=20;console.log(^ui^ber);//2.0consttaukv\ber=IO;//UMaugktSyiataxError:Identifier^lA^ber1kasalreadybeendeclared现在,看下面的代码:constarr=[t,2,3,4];八so/e./ogS");//[1,2,3,4,5]我们说过const声明的常量,它的值永远不会改变——但是我们改变了上面的常量数组并没有报错。这是为什么呢?注意:数组是引用类型,而不是JavaScript的基本类型实际存储在arr中的不是数组,而是数组存储的内存位置的引用(地址)。执行arr.push(5),并没有改变arr指向的引用,而是改变了存储在那个引用上的值。对象也是如此:constobj-{'David1age:"50obj.age=4。;console.log(obj);//(laakvxe:'David'fage:40)这里,我们也没有改变。bj指向的引用,而是改变了存储在引用的值。因此,上述的代码将会起作用,但下面的代码是无效的。constobj={'Davidsage:30};constobj工={0。叱:age:40};obj=。句工;//UMaughtTypeError.Assignmenttocoiastai^tvariable.这样写会抛出异常,因为我们试图更改const变量指向的引用。因此,在使用const时要记住一点:使用const声明常量时,不能重新声明,也不能重新赋值。如果声明的常量是引用类型,我们可以更改存储在引用的值。同理,下面的代码也是无效的。const=口,2, 4];=[IO,20,50];//UncaughtTypeError:Assynwenttoconstantvariable.总结:关键字let和const在JavaScript中添加块级作用域。当我们将一个变量声明为let时,我们不能在同一作用域(函数或块级作用域)中重新定义或重新声明另一个具有相同名称的let变量,但是我们可以重新赋值。当我们将一个变量声明为const时,我们不能在同一作用域(函数或块级作用域)中重新定义或重新声明具有相同名称的另一个const变量。但是,如果变量是引用类型(如数组或对象),我们可以更改存储在该变量中的值。好了,我们继续下一个话题:promises。JavaScript中的promises对于很多新开发者来说,promises是JavaScript中较难理解的部分。ES6中原生提供了Promise对象,那么Promise究竟是什么呢?Promise对象代表了未来将要发生的事件,用来传递异步操作的消息。如何创造一个promise使用promise构造函数创建一个promise,如下所示:constpromise=newPro^v\ise(functioi^(re^olve,reject){});Promise的构造函数接收一个函数作为参数,并且在内部接收两个参数:resolve,rejectoreserve和reject参数实际上是我们可以调用的函数,具体取决于异步操作的结果。Promise有三种状态:pending:初始状态,不是成功或失败状态。fulfilled:表示操作成功完成。rejected:表示操作失败。当我们创建Promise时,它处于等待的状态。当我们调用resolve函数时,它将进入已完成状态。如果调用reject,他将进入被拒绝状态。在下面的代码中,我们执行了一个异步操作,也就是setTimeout,2秒后,调用resolve方法。constpromise=ncwPro^v\ise(furesolve>reject){constsum=4+5;resolve(suw);}>2.OOO);));我们需要使用以下方法注册一个回调.then获得lpromise执行成功的结果,如下所示:constprokvu'se=mvj 八ct7。八reject){setTikv\eout(fuMtion(){constSUkvv=4+5;res。/砥s〃叫;b2000);});prow/se.theH(function(result){con$ole.log(result);//q!);then接收一个参数,是函数,并且会拿到我们在promise中调用resolve时传的的参数。如果操作不成功,则调用reject函数:constprokvu'se=newPr0kvuMe(f〃八ct7。八(resolve,reject){setTikv\eout(f(AnctionO{constsukvv=4+S+W;rejectCErrorwklecalculatingsuha/);}eke(reso/vefsuw);}卜2000);));promise.tken(function(result){console.log(result);1);如果sum不是一个数字,那么我们调用带有错误信息的reject函数,否则我们调用resolve函数。执行上述代码,输出如下:G0DvnaroConaoie8MoMMatwortiPartornwwMemory S«xr«y Redui•iO:X咆0 10P ♦❷ OalBUt, 2Bdvs。>48,tprcaiw•*•*»Fr«Biw(funttresolw,eject)<c»Mt1•,・$•*a*irtjectCt»r»r«*itoc*l<«Ut»«0.*>s>«Im<>HlfwMt<coamU.U9lrewlt13>h9 (in.rw2)frrertAiWcalcvlatiavwb« ntrtAfr-Mtt/xl»调用reject函数会抛出一个错误,但是我们没有添加用于捕获错误的代码。需要调用catch方法指定的回调函数来捕获并处理这个错误。prokv\/$e.theH(funct/o^(resu(t){console.log(result);}).catck(Fc<nction(error){console.log(erroir);});输出如下:Gj]EtonartsConaoi*SourcmNMwcrtiPvlornwK*MamoryAopacationSecurwyUgMhouMRadha 0 :X囱0top *G>Gar DataJi♦ 1Miar。»const •newRtobimIf««Ktlo«(rVMlv*. tCOA»t3•4♦3♦•••:iSWMMd)<r*)«ct(*trr«rwhitecalcvUt><)/•••»;>H3sl♦.U«(rvwtthM>C4t<h(fuA<tief«(«rf«f)(COOMU.>h»FroMMtr*»r«MltstcvlatSw*«»I所以建议大家在使用promise时加上catch方法,以此来避免程序因错误而停止运行。链式操作我们可以向单个promise添加多个then方法,如下所示:proi^ise.tkek\(fuMtioia(result){c。八sole.log('fidt.theiahandler1);returnresult;}).tkeia(f(AMtiok\(result){console.logCsecoiad.the八k〃八d/eL);consoIe.Iog(result);}).c«tch(fuiact/OH(error){console.log(error);!);

当添加多个then方法时,前一个then方法的返回值将自动传递给下一个then方法。Rfl MemoryA^tcaaonS«M«yUgr*ouMRM*囿0 8 ■ .Htar DaMlwaM.»c8ttprtBtM•new^ro>l*«(fu*ctloe(rvMlv*.reject)<<8,,tW•4•>;rcj«<t(*trr»rtAiUc«lcuUtififwa.>«lw<prwiM.tMn<fwA<ir«wlt)<.Q2MMWr*)2retuemwlt;>).thM(ftrfICtio»<r»«vltI<C«»MU.<•<<dh«Mter*);c«MMl«.(ov(r*wUh>).catcB(fufictiofl(«rrer)<»l•FrMJMmuaujWUUiUwoiaa;muaujWUUiUwoiaa;WCOM.«M«MMUr如上图所示,我们在第一个then方法中输出字符串,并将接收的参数result(sum)返回给下一个resulto在下一个then方法中,输出字符串,并输出上一个then方法传递给它的result。如何在JavaScript中延迟promise的执行很多时候,我们不希望立即创建promise,而是希望在某个操作完成后再创建。我们可以将promise封装在一个函数中,然后从函数中返回promise,如下所示:fuiactioncreateProFvu'seO{returnnewPr*0kvu'se(fu八ct7。八(resolve,reject){setTYkweoat(Function。{constsum=4+5;if(isN〃N(S”Fvk)){re.je.ct('Errorwhilecalculatesum.,}else(resolve(sum);}1,2.000);1);)这样,我们就可以通过函数将参数传递给promise,达到动态的目的。functioncreate?b){returnnewPromise(fun.ct/o^(resol\/eJreject){setTimeout(fu^ctio^(){coastsum=a+b;if(isNaZ(s〃m))(rejectCErrorwki他calculatingsum?);}else{resolve(sum);1bZOOO);1);)

crenteProkvu'se(工8)console.log(output);//91);//OR"eatePr0Fvu'se(f24).then(functio^(output){console.Iog(output);//34QflEWwtaCcnaoi*Scx«omNrtwortiPvlomwK*MemoryA9pteMOA9ao#«rUfiT*<ouwAadus QflEWwtaCcnaoi*Scx«omNrtwortiPvlomwK*MemoryA9pteMOA9ao#«rUfiT*<ouwAadus 。|X>fuMttMerf■,《•<•・»)<Eve0 r«)«Ct>(«etTiaeowtlfiiACti»R<)<c«Htua•••b:r«)ect(*KrrorwhileC«l<Ml«tM*9M*.*)|>«lw<>>.”M);H:>c te,*aI”<8・・).thc«(f«MKtlon(««tRlt»<cmmU.Uglwtput);//9crMtc^roaiMlie.HIC«»t4U.lMl«vt9ut)://34>h»FnwiM• tftUUMM MU4U1此外,我们只能向resolve或reject函数传递一个值。如果你想传递多个值到resolve函数,可以将它作为一个对象传递,如下:constpromise=newProkv\ise(functioi^(resolveJreject){setTikv\eo(At(functioi^O{constsuha=4+5;%soHe({4j5,suha.});}>zooo);));prom/sefav\ctio^(r6^ult){console,fo3frescxlt);}).catch(fui^ction(error){co^ole.log(error);});孱(J]BvmntsOomotoSoucmNaeworHf**rtormano»MemoryAppicafaonS«u«fUqWioumRadui 。:X00top ■®F«v DetaJtiMiv 2M01rQ>co*»Hprg*i»9-fFraaiMtlunct>«»< <MtTkaeotfttftfhctkMO<co*it*■>4•5jr*Mlw(<•:%fc!九MB»S>.hiIHoam.1♦»♦«(fw»Ktion(result►<coitv»lc4104Irrt«ltJ:I8l”er>(con»lc.lO9(«rr«»rH»:*f«r,65.Mif| «2t);U>I如何在JavaScript中使用箭头函数上述示例代码中,我们使用常规的ES5语法创建了promise。但是,通常使用箭头函数代替ES5语法,如下:constpromise=mvj reject)=>{setTikv\eout(0=>{constsum=4+5+'a1;if(isN〃N(su叫){rejectCErrorwhilecalculatingsuw/);}else(resolve(sunA);}上2000);!);promise.the八((res〃/t)=>{console.log(result);!);你可以根据自己需要使用ES5或ES6语法。ES6Import和Export语法在ES6之前,我们在一个HTML文件中可以使用多个script标签来引用不同的JavaScript文件,如下所示:scripttype-"text/javascript1$rc=,,kokv\e.js,,x/$cript><scripttype-ute)ct/javascnpt"we="psfileJScHptxscHpttype-"text/javascript11src="〃serjs">〈/scr7P亡》但是如果我们在不同的JavaScript文件中有一个同名的变量,将会出现命名冲突,你实际得到的可能并不是你期望的值。ES6增加了模块的概念来解决这个问题。在ES6中,我们编写的每一个JavaScript文件都被称为模块。我们在每个文件中声明的变量和函数不能用于其他文件,除非我们将它们从该文件中导出并、在另一个文件中得到引用。因此,在文件中定义的函数和变量是每个文件私有的,在导出它们之前,不能在文件外部访问它们。export有两种类型:・命名导出:在一个文件中可以有多个命名导出・默认导出:单个文件中只能有一个默认导出JavaScript中的命名导出如下所示,将单个变量命名导出:exportconstte^v\p="Thisisdu339text11,如果想导出多个变量,可以使用大括号指定要输出的一组变量。constte.iAA,p2.="Thisissomcdukwkuyconst =11Thisissokvvedukv\i^ytextZ"export{ tei^v\p2.);需要注意的是,导出语法不是对象语法。因此,在ES6中,不能使用键值对的形式导出。</pre>//ThisisinvalidsyntaxofexportMES6export{keyl:valued,key2:valued}import命令接受一对大括号,里面指定要从其他模块导入的变量名import{tenApl,teMp2)froku'./filename1;注意,不需要在文件名中添加Js扩展名,因为默认情况下会考虑该拓展名。//importFkomafu八ctions.jsfileF/okwcurrentdirectoryimport{ tap2)froFw'./fu八c力'。八s';//importfroMfu八ctions.jsfilefrokv\parentofcurrentdirectoryimport{tempi}frokvx,../fmactioi^1;提示一点,导入的变量名必须与被导入模块对外接口的名称相同。因此,导出应使用://con$tant$.jsexportconstPI=3.14159;那么在导入的时候,必须使用与导出时相同的名称:import{PI} '/constMts';//Thiswillthrowanerrorimport{PiValue}frona\/constants1;如果想为输入的变量重新命名,可以使用as关键字,语法如下:import{PtasPiValue}frow'./constants';我们以为PI重命名为PiValue,因此不能再使用PI变量名。导出时也可使用下面的重命名语法://constantsjsconstPI=3.14159;export{PIasPIValue);然后在导入是,必须使用PIValue。import{PIValue}frow'./constn八ts';命名导出某些内容之前必须先声明它。export'hello1;//thiswillresultMerrorexportconstgreeting='hello1;//thiswillworkexport{八amc:'David1};//ThiswillresultMerrorexportconstobject={nakvte:'David*};//Thiswillwork我们来看下面的validations.js文件://utils/validatio^s.jsconstisValidEi^ail=function(ekv\ail){if(/八[八@]+@[人@J+\.[人@\.]{2 {return"eMailisvalid”;}eke(return"ei^ailisinvalid”;

consti^ValidPkoM=functio^(phoM)(return}ekereturn"phoiaeHUhAfaerisinvalid";returnfunctionisEkv^pty(value){functionisEkv^pty(value){if(/八W.test(v4/ue))(return"stHngise叫元gorcontainon/yspaces";}eke(return"stirMgisnotenaptyanddoeslaotc。八t〃,八spaces";]}export{isValidEmaiLisValidPho八e,isEmptg);在index.js中,我们可以使用如下函数://index.jsimport{isEmptg,isValidEMail}firoM"./util^/validatioy^";c。八sole.logC'isEMptg:",i^Ekv\pty(uabcd"));//isEi^pty:strMgisnote^ptya^ddoes八。七containspacesccmsole.logC'kValiclEMail:",isValidEi^ail(,,abc^lt.gi^.ail.co^v\,,y)://isValidEmail:Ckvxailisvalidco^o(e.log(,lisValidE^ail:ujisValidEi^ailC'ab^c^Xlg^ail.co^y);//isValidEMail:ekvxailisinvalidJavaScript的默认导出如上所述,单个文件中最多只能有一个默认导出。但是,你可以在一个文件中使用多个命名导出和一个默认导出。要声明一个默认导出,我们需要使用以下语法:const八〃kv\e='David1;exportdefault八〃Rue;在导入时就不需要再使用花括号了。importna^vxefrow/constants1;如下,我们有多个命名导出和一个默认导出://constantsjsexportconstPI=3.141^47;exportconstAGE=30;constNAME="David";exportdefaultNAME;此时我们使用import导入时,只需要在大括号之前指定默认导出的变量名。//NAMEisdefaultexportav\dPla^dAGEare.v\aw\edexportshereimportNAME,{PI,AGE}frow'./c。八st。八七s';使用exportdefault导出的内容,在导入的时候,import后面的名称可以是任意的。//。。八八tsjsconstAGE=30;exportdefaultAGE;importi^yAge(Yom'./constants’;console.log(i^yAge);//~50另外,exportdefault的变量名称从Age到myAge之所以可行,是因为只能存在一个exportdefault。因此你可以随意命名。还需注意的是,关键字不能在声明变量之前。//constaiats.jsexportdefaultconstAGE=30;//Thisis〃八erroraiadwillnotwork因此,我们需要在单独的一行使用关键字。//COnStMtsJsconstAGE=exportdefaultAGE;不过以下形式是允许的:〃c。八stantsjsexportdefault{iaakv\e:''Billy",age:40};并且需要在另一个文件中使用它importuserfrokvv'./constants';console.log(user.nai^e);//Billyc。八so/e」og(,wge);//40还有,可以使用以下语法来导入constants.js文件中导出的所有变量://test”import*asconstantsfrokvx。/constM切;下面,我们将导入所有我们constants.js存储在constants变量中的命名和exportdefaulto因此,constants现在将成为对象。//constaiatsjsexportconstUSERNAME-"David";exportdefault{八〃Me:"Billg",age:40在另一个文件中,我们按一下方式使用。//test”import*asconstantsf/OM,./con$tants,;console.Iog(co八贪antS.USERNAME);//Davidco^ole.log(con$ta^ts.default);//{name:"Billg1^age:40}co^ole,log(co^tav\t^.default.age);//40也可以使用以下方式组合使用命名导出和默认导出://const^ntsjsconstPI=3.1415句constAGE=36);constUSERNAME="David";constUSER={八akwe:age:401;export{PI,ACE,USERNAME,USERasdefault];importUSERj{PGACE,USERNAME}from"./co八s±m±s";总而言之:ES6中,一个模块就是一个独立的文件,该文件内部的所有变量,外部都无法获取。如果想从外部读取模块内的某个变量,必须使用export关键字导出该变量,使用import关键字导入该变量。JavaScript中的默认参数ES6增加了一个非常有用的特性,即在定义函数时提供默认参数。假设我们有一个应用程序,一旦用户登录系统,我们将向他们显示一条欢迎消息,如下所示:function {return"Welcome.back,11+firstA/^kue;)co八S0/e」og(skowMessage(UoW));//Welcomeback,Johia但是,如果数据库中没有用户名,那该怎么办呢?所以,我们首先需要检查是否提供了firstName,然后再显示相应的信息。在ES6之前,我们必须写这样的代码:functions〃owMessage(fMstNe){if(firstNa^e){return"VJelco^eback,11+firstName;}else(return"We/co*^eback.Guest1;})consoleJog(sko\A/Messag&('Joh^.'))://VJelcoi^eback,J。〃八c。八sHeJog(skowMessageO);//Welcomeback,Guest但现在使用ES6提供的默认参数,我们可以这样写:fuMtio^showMess^efftrstAJ«kwe='Guest'){return"We/cokneback,"+firstName;1co八sole・/og(sh0wMessage('JoW));//Welcomeback,Johiac。八so/e」og(skowMessageO);//Welcomeback,Guest函数的默认参数可以为任意值。fuHCt/ondisplay(a=b=2.0,c-b){console.Iog(ajb,c);)displagO;//IO2-02。display(4O);//402.020displagj,70);//17070display^,30,70);//13(970在上面的代码中,我们没有提供函数的所有参数,实际代码等同于:displayO;//等同于力sp/ag((x八^«行八0/u八defined,〃八deFked)display(4O);等同于d/Mp/a9(4O,uiadefiMdjuiadefiMd)display(lJ70);等同于disp/〃g(,IO.undefined)因此,如果传递的参数是undefined,则对应的参数将使用默认值。我们还可以将对象或计算值指定为默认值,如下:constdefaultUseir={八ame:UaM^location:'NY,job:'SoftwareDeveloper1);constdisplay=(user=defaultU^efjage=bO/2)=>{console.logCu^eiTjage);display();/*output八ame:Umc',location:^Y,job:'SoftwareDevdoper1}3(2*/ES5代码如下://ES5CodefunctiongetUsers(page,resu/ts,gender,nationality){varparams=

if(page===O||page.){params■>■二params十二、烟〃依二,{匕s“灼&';if(gender)params十二、gc八der■二$的end"}&';params十=Vationaf/'ty=^{nat/onality}v;+pa曰ms).fwiactiov\(response){returnrespo八sejson();!).tiAenffunct/onfresult){,。八so/e./og(烟uft);!).catch(fuv\ctioi^(error){co^ole.logCerror1,error);!);getUsevs。1。,As);在这段代码中,我们通过在getUsers函数中传递各种可选参数来进行API调用。在进行API调用之前,我们添加了各种if条件来检查是否添加了参数,并基于此构造查询字符串,如下所示:https://夕acdoMuser.Me/api/?page=O&res川ts;工。&ge八der=kv\He&八。七'。八使用ES6的默认参数则不必添这么多if条件,如下所示:functiongetUsers(page=O,results=XOtgender=^ale^natioi^ality=ts'){fetchChttps://iraiadokv\u$er.kv\e/api/?page=^{pageJ&:results=f{result$j&geiader=${gender}&:nationality=${v\atioi^alityy).thenffuk\ct/01^(response){returnresponsejsoh();!).t/ien(funct/on(resu(t){console.Iog(re$ult);!).catck(fuMtioia(eKror){consoledogCerror1,error);!);)getUsersO;这样一来,代码得到了大量的简化,即便我们不为getUsers函数提供任何参数时,它也能采用默认值。当然,我们也可以传递自己的参数:getUseHS(lj20'female^'gby,它将覆盖函数的默认参数。null不等于未定义注意:定义默认参数时,null和undefined是不同的。我们来看下面的代码:Fuccti。八di$play(nakv\e='David1,age=^>5,location='NY){coyote.Iog(^akv\ejage,location);displayCDavid1jdisplayCDavid1j5S);//David3SNYdisplayCDavid'jUndefined);displayCDavid'jUndefined);//David3SNY//ORdisplayCDavid1j3S,undefined);displayCDavid1j3S,undefined);//David3SNYdisplay(,David,J八川f);//David3S八〃〃当我们传递null作为参数时,它实际是给location参数赋一个空值,与undefined不一样。所以它不会取默认值"NY"。</pre>Atotype.includesES7增加了数组的includes方法,用来判断一个数组是否包含一个指定的值,如果是返回true,否则false。//ESSCodeconstnuknfaers=["om","two","three","four"];coin.sole.log(in.u^v\bers.ir\d.exOf("oin.e.")>-1);//truecoia.sote.log(i^uv>A.bers.indexOf("five")>-1);//false数组可以使用includes方法://ES7Codeconstnukufaers=["om","two","three","four''];co^sole.log(^ui^bers.i^cludes("oM,,y);//trueconso/e・/ogWukv\Sers.kc/udes("f20a));//fakeincludes方法可以使代码简短且易于理解,它也可用于比较不同的值。<prestgle="ice-height:18.Opt;vertical-align:baseliM">constday=11Monday";</pre>if(day===''Monday11||day==="tuesday"||day==="Wednesday)(//dosomething]//以上代码使用include方法可以简化如下:constday

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论