Web前端工程师应该知道的提高JavaScript技能的技巧!

今天小编要跟大家分享的文章是关于Web前端工程师应该知道的提高JavaScript
技能的技巧!熟悉web前端工作的小伙伴都知道,JavaScript是前端工程师的必备技能。JavaScript
是一种复杂的语言。如果是你是高级或者初级web开发人员,了解它的基本概念非常重要。本篇文章小编就为大家介绍几种提高JavaScript
技能的技巧,下面让我们一起来看一看吧!





01、变量赋值(值vs引用)


理解JavaScript如何给变量赋值可以帮助我们减少一些不必要的bug。如果你不理解这一点,可能很容易地编写被无意中更改值的代码。


JavaScript总是按照值来给变量赋值。这一部分非常重要:当指定的值是JavaScript的五种基本类型之一(即
Boolean,null,undefined,String和Number)时,将分配实际值。但是,当指定的值是
Array,Function或Object时,将分配对内存中对象的引用给变量。


在以下代码段中,使用var1对var2进行赋值。由于var1是基本类型(String),因此var2的值等于var1的String
值,并且可以认为此时与var1完全不同。因此,重新赋值var2对var1没有影响。



letvar1='Mystring';

letvar2=var1;

var2='Mynewstring';

console.log(var1);

//'Mystring'

console.log(var2);

//'Mynewstring'

接着,与对象赋值进行比较。



letvar1={name:'Jim'}

letvar2=var1;

var2.name='John';

console.log(var1);

//{name:'John'}

console.log(var2);

//{name:'John'}

如果你期望它会像原始类型赋值那样,很可能会出问题!如果你创建了一个无意中会改变对象的函数,就会出现一些非预期的行为。


02、闭包


闭包是一个重要的JavaScript模式,可以私有访问变量。在本例中,createGreeter返回一个匿名函数,这个函数可以访问参数
greeting(在这里是“Hello”)。在后续的调用中,sayHello将有权访问这个greeting!



functioncreateGreeter(greeting){

returnfunction(name){

console.log(greeting+','+name);

}

}

constsayHello=createGreeter('Hello');

sayHello('Joe');

//Hello,Joe

在更真实的场景中,你可以设想一个初始函数apiConnect(apiKey),它返回一些使用APIkey的方法。在这种情况下,apiKey
只需要提供一次即可。



functionapiConnect(apiKey){

functionget(route){

returnfetch(`${route}?key=${apiKey}`);

}

functionpost(route,params){

returnfetch(route,{

method:'POST',

body:JSON.stringify(params),

headers:{

'Authorization':`Bearer${apiKey}`

}

})

}

return{get,post}

}

constapi=apiConnect('my-secret-key');

//NoneedtoincludetheapiKeyanymore

api.get('#/get-endpoint');

api.post('#/post-endpoint',{name:'Joe'});

03、解构


JavaScript参数解构可以从对象中干中提取所需属性的常用方法。



constobj={

ame:'Joe',

food:'cake'

}

const{name,food}=obj;

console.log(name,food);

//'Joe''cake'

如果要以其他名称提取属性,可以使用如下方式:



constobj={

ame:'Joe',

food:'cake'

}

const{name:myName,food:myFood}=obj;

console.log(myName,myFood);

//'Joe''cake'

解构经常也用于直接用于提取传给函数的参数。如果你熟悉React,可能已经见过这个:



constperson={

ame:'Eddie',

age:24

}

functionintroduce({name,age}){

console.log(`I'm${name}andI'm${age}yearsold!`);

}

console.log(introduce(person));

//"I'mEddieandI'm24yearsold!"

04、展开运算


ES6的一个常用之一的特性就是展开(...)运算符了,在下面的例子中,Math.max不能应用于arr
数组,因为它不将数组作为参数,但它可以将各个元素作为参数传入。展开运算符...可用于提取数组的各个元素。



constarr=[4,6,-1,3,10,4];

constmax=Math.max(...arr);

console.log(max);

//10

05、剩余参数


剩余参数语法和展开语法看起来的一样的,不同的是展开语法是为了结构数组和对象;而剩余参数和展开运算符是相反的,剩余参数收集多个元素合成一个数组。



functionmyFunc(...args){

console.log(args[0]+args[1]);

}

myFunc(1,2,3,4);

//3

restparameters和arguments的区别


1.arguments是伪数组,包含所有的实参


2.剩余参数是标准的数组,可以使用数组的方法


06、数组方法


JavaScript数组方法通常可以提供令人难以置信的、优雅的方法来执行所需的数据转换。作为StackOverflow
的贡献者,我经常看到关于如何以某种方式操纵对象数组的问题,这往往也是数组方法的完美用例。


map、filter、reduce


JavaScript数组方法map、filter和reduce容易混淆,这些都是转换数组或返回聚合值的有用方法。


map:返回一个数组,其中每个元素都使用指定函数进行过转换。



constarr=[1,2,3,4,5,6];

constmapped=arr.map(el=>el+20);

console.log(mapped);

//[21,22,23,24,25,26]

filter:返回一个数组,只有当指定函数返回true时,相应的元素才会被包含在这个数组中。



constarr=[1,2,3,4,5,6];

constfiltered=arr.filter(el=>el===2||el===4);

console.log(filtered);

//[2,4]

reduce:按函数中指定的值累加



constarr=[1,2,3,4,5,6];

constreduced=arr.reduce((total,current)=>total+current);

console.log(reduced);

//21

find,findIndex,indexOf

find:返回与指定条件匹配的第一个实例,如果查到不会继续查找其他匹配的实例。



constarr=[1,2,3,4,5,6,7,8,9,10];

constfound=arr.find(el=>el>5);

console.log(found);

//6

再次注意,虽然5之后的所有元素都满足条件,但是只返回第一个匹配的元素。当你发现匹配项时,通常会中断for循环,在这种情况下,这实际上非常有用。


findIndex:这与find几乎完全相同,但不是返回第一个匹配元素,而是返回第一个匹配元素的索引。



constarr=['Nick','Frank','Joe','Frank'];

constfoundIndex=arr.findIndex(el=>el==='Frank');

console.log(foundIndex);

//1

indexOf:与findIndex几乎完全相同,但它不是将函数作为参数,而是采用一个简单的值。
当w你需要更简单的逻辑并且不需要使用函数来检查是否存在匹配时,可以使用此方法。

constarr=['Nick','Frank','Joe','Frank'];

constfoundIndex=arr.indexOf('Frank');

console.log(foundIndex);

//1

push,pop,shift,unshift

push:这是一个相对简单的方法,它将一个项添加到数组的末尾。它就地修改数组,函数本身会返回添加到数组中的项。

letarr=[1,2,3,4];

constpushed=arr.push(5);

console.log(arr);

//[1,2,3,4,5]

console.log(pushed);

//5

pop:这将从数组中删除最后一项。同样,它在适当的位置修改数组,函数本身返回从数组中删除的项。

letarr=[1,2,3,4];

constpopped=arr.pop();

console.log(arr);

//[1,2,3]

console.log(popped);

//4

shift:从数组中删除第一项。同样,它在适当的位置修改数组。函数本身返回从数组中删除的项。

letarr=[1,2,3,4];

constshifted=arr.shift();

console.log(arr);

//[2,3,4]

console.log(shifted);

//1

unshift:将一个或多个元素添加到数组的开头。同样,它在适当的位置修改数组。与许多其他方法不同,函数本身返回数组的新长度。

letarr=[1,2,3,4];

constunshifted=arr.unshift(5,6,7);

console.log(arr);

//[5,6,7,1,2,3,4]

console.log(unshifted);

//7

splice,slice

splice:通过删除或替换现有元素和/或添加新元素来更改数组的内容,此方法会修改了数组本身。


下面的代码示例的意思是:在数组的位置1上删除0个元素,并插入b。


letarr=['a','c','d','e'];


arr.splice(1,0,'b')


slice:从指定的起始位置和指定的结束位置之前返回数组的浅拷贝。如果未指定结束位置,则返回数组的其余部分。
重要的是,此方法不会修改数组,而是返回所需的子集。

letarr=['a','b','c','d','e'];

constsliced=arr.slice(2,4);

console.log(sliced);

//['c','d']

console.log(arr);

//['a','b','c','d','e']

sort

sort:根据提供的函数对数组进行排序。这个方法就地修改数组。如果函数返回负数或0,则顺序保持不变。如果返回正数,则交换元素顺序。

letarr=[1,7,3,-1,5,7,2];

constsorter=(firstEl,secondEl)=>firstEl-secondEl;

arr.sort(sorter);

console.log(arr);

//[-1,1,2,3,5,7,7]

07、Generators(生成器)


生成器是一种特殊的行为,实际上是一种设计模式,我们通过调用next()方法来遍历一组有序的值。想象一下,例如使用遍历器对数组[1,2,3,4,5]进行遍历。第一次调用next()方法返回1,第二次调用next()方法返回2,以此类推。当数组中的所有值都返回后,调用next()方法将返回null或false或其它可能的值用来表示数组中的所有元素都已遍历完毕。

function*greeter(){

yield'Hi';

yield'Howareyou?';

yield'Bye';

}

constgreet=greeter();

console.log(greet.next().value);

//'Hi'

console.log(greet.next().value);

//'Howareyou?'

console.log(greet.next().value);

//'Bye'

console.log(greet.next().value);

//undefined

使用生成器生成无限个值:

function*idCreator(){

leti=0;

while(true)

yieldi++;

}

constids=idCreator();

console.log(ids.next().value);

//0

console.log(ids.next().value);

//1

console.log(ids.next().value);

//2

//etc...

08、恒等运算符(===)与相等运算符(==)


大家一定要知道JavaScript中的恒等运算符(===)和相等运算符(==)之间的区别!
==运算符在比较值之前会进行类型转换,而===运算符在比较之前不会进行任何类型转换。

console.log(0=='0');

//true

console.log(0==='0');

//false

09、对象比较


我看到JavaScript新手所犯的错误是直接比较对象。变量指向内存中对象的引用,而不是对象本身!实际比较它们的一种方法是将对象转换为JSON
字符串。这有一个缺点:对象属性顺序不能保证!比较对象的一种更安全的方法是引入专门进行深度对象比较的库(例如,lodash的isEqual)。


下面的对象看起来是相等的,但实际上它们指向不同的引用。

constjoe1={name:'Joe'};

constjoe2={name:'Joe'};

console.log(joe1===joe2);

//false

相反,下面的计算结果为true,因为一个对象被设置为与另一个对象相等,因此指向相同的引用(内存中只有一个对象)。

constjoe1={name:'Joe'};

constjoe2=joe1;

console.log(joe1===joe2);

//true

相反,以下计算结果为true,因为一个对象设置为等于另一个对象,因此指向相同的引用(内存中只有一个对象)。

constjoe1={name:'Joe'};

constjoe2=joe1;

console.log(joe1===joe2);

//true

10、回调函数


很多人都被JavaScript回调函数吓倒了!他们很简单,举个例子。console.log函数作为回调传递给myFunc。
它在setTimeout完成时执行。

functionmyFunc(text,callback){

setTimeout(function(){

callback(text);

},2000);

}

myFunc('Helloworld!',console.log);

//'Helloworld!'

11、Promises


一旦你理解了JavaScript回调,很快就会发现自己陷入了“回调地狱”中。这个时候可以使用promise,将异步逻辑包装在promise
中,成功时resolve或在失败时reject使用“then”来处理成功的情况,使用catch来处理异常。

constmyPromise=newPromise(function(res,rej){

setTimeout(function(){

if(Math.random()<0.9){

returnres('Hooray!');

}

returnrej('Ohno!');

},1000);

});

myPromise

.then(function(data){

console.log('Success:'+data);

})

.catch(function(err){

console.log('Error:'+err);

});

//IfMath.random()returnslessthan0.9thefollowingislogged:

//"Success:Hooray!"

//IfMath.random()returns0.9orgreaterthefollowingislogged:

//"Error:Onno!"

12、Async/Await


在掌握了promise的用法后,你可能也会喜欢asyncawait,它只是一种基于promise
的“语法糖”。在下面的示例中,我们创建了一个async函数,并awaitgreeterpromise。

constgreeter=newPromise((res,rej)=>{

setTimeout(()=>res('Helloworld!'),2000);

})

asyncfuncti

  • Web鍓嶇宸ョ▼甯堝簲璇ョ煡閬撶殑鎻愰珮JavaScript鎶鑳界殑鎶宸!
    绛旓細鎶鑳界殑鎶宸!鐔熸倝web鍓嶇宸ヤ綔鐨勫皬浼欎即閮界煡閬,JavaScript鏄墠绔伐绋嬪笀鐨勫繀澶囨妧鑳銆侸avaScript鏄竴绉嶅鏉傜殑璇█銆傚鏋滄槸浣犳槸楂樼骇鎴栬呭垵绾eb寮鍙戜汉鍛,浜嗚В瀹冪殑鍩烘湰姒傚康闈炲父閲嶈銆傛湰绡囨枃绔犲皬缂栧氨涓哄ぇ瀹朵粙缁嶅嚑绉嶆彁楂楯avaScript鎶鑳界殑鎶宸,涓嬮潰璁╂垜浠竴璧锋潵鐪嬩竴鐪嬪惂!01銆佸彉閲忚祴鍊(鍊紇s寮曠敤)鐞嗚ВJavaScript濡備綍缁欏彉閲忚祴鍊煎彲浠ュ府鍔╂垜浠...
  • web鍓嶇寮鍙 鍙互鍋氬摢浜鎻愬崌
    绛旓細濡備粖鎴戜滑鎵璋撶殑web鍓嶇寮鍙,鐩搁渶瑕佷綘浼氬啓JS銆佷細鐢↗S銆佽兘璁捐銆佸垏鍥俱佹噦浣跨敤鑰呬簰鍔ㄧ瓑,杩橀渶瑕佸墠绔灦鏋勬槸寮鍙戝拰浼樺寲妗嗘灦,鍙婁己鏈嶅櫒,浣跨敤鑰呬綋楠岀瓑娑夋辈灏辨瘮杈冨箍,褰撶劧鍏ㄦ爤寮忓墠绔伐绋嬪笀宸ヨ祫涔熷氨姣旇緝楂樹簡銆 鍓嶇寮鍙戝伐绋嬪笀鐨勪富瑕佽亴璐f槸涓庝簰鍔ㄨ璁″笀銆 瑙嗚璁捐甯堝崗浣,鏍规嵁璁捐鍥剧敤HTML鍜孋SS瀹屾垚椤甸潰鍒朵綔(涔熷彲鑳芥槸涓涓汉瀹...
  • Web鍓嶇寮鍙宸ョ▼甯鎬庢牱鎻愰珮鑷繁
    绛旓細绗竴锛蹇呴』鎺屾彙鍩烘湰鐨刉eb鍓嶇寮鍙戞妧鏈紝鍏朵腑鍖呮嫭锛欳SS銆丠TML銆丏OM銆丅OM銆丄jax銆丣avaScript绛锛屽湪鎺屾彙杩欎簺鎶鏈殑鍚屾椂锛岃繕瑕佹竻妤氬湴浜嗚В瀹冧滑鍦ㄤ笉鍚屾祻瑙堝櫒涓婄殑鍏煎鎯呭喌銆佹覆鏌撳師鐞嗗拰瀛樺湪鐨凚ug銆傜浜岋紝鍦ㄤ竴鍚嶅悎鏍肩殑鍓嶇宸ョ▼甯堢殑鐭ヨ瘑缁撴瀯涓紝缃戠珯鎬ц兘浼樺寲銆丼EO鍜屾湇鍔″櫒绔殑鍩虹鐭ヨ瘑涔熸槸蹇呴』鎺屾彙鐨勩傜涓夛紝蹇呴』瀛︿細杩...
  • web鍓嶇宸ョ▼甯濡備綍鎻愬崌鎶鏈按骞
    绛旓細绗竴锛鑾峰彇鐩稿叧淇℃伅銆傚彲浠ラ氳繃娴忚鎷涜仒淇℃伅鎴栬呰闂韩杈逛粠浜嬪墠绔伐浣滅殑鏈嬪弸鏉ュHTML5澶у墠绔互鍙婂墠绔紑鍙戠殑宸ヤ綔鍐呭杩涜涓涓垵姝ヤ簡瑙c備竴鑸潵璇达紝鍓嶇寮鍙戝伐绋嬪笀鐨勫伐浣滃寘鎷細浣跨敤HTML銆丆SS銆丣avaScript绛変笓涓氭妧鏈拰宸ュ叿灏哢I璁捐绋垮疄鐜颁负鐢ㄦ埛PC绔佺Щ鍔ㄧ缃戦〉绛夌綉绔欎骇鍝侊紝鍚屾椂澶勭悊鐩稿叧绔彛鐨勮瑙夊拰浜や簰闂绛夈傜浜...
  • web 鍓嶇宸ョ▼甯鏈夊摢浜涢渶瑕佸繀椤绘帉鎻$殑鎶鑳?
    绛旓細Web鍓嶇宸ョ▼甯堥渶瑕佹帉鎻$殑鎶鑳藉寘鎷細1. 鍓嶇鍩虹锛欻TML銆丆SS銆丣avaScript鏄疻eb鍓嶇寮鍙戠殑涓夊ぇ鍩虹鐭ヨ瘑锛屾帉鎻¤繖浜涙妧鑳芥槸蹇呭鐨勬牳蹇冩妧鑳姐侶TML+CSS鍙互鍋氬嚭绠鍗曠殑闈欐侀〉闈紝鑰孞avaScript鍙互鎻愪緵鏇村ソ鐨勭敤鎴蜂綋楠屻傚湪鍘嗙粡澶氭鐗堟湰鏇存柊涔嬪悗锛孒TML5鍜孋SS3鐨勫嚭鐜板張鏄竴娆¢潻鏂般備絾瀵逛簬Web鍓嶇寮鍙戜粠涓氳呮潵璇存帉鎻TML銆丆SS...
  • 2020骞Web鍓嶇宸ョ▼甯堢殑瀛︿範寤鸿
    绛旓細姣棤鐤戦棶,Git鏄綋浠Web寮鍙戜腑鐗堟湰鎺у埗鐨勬爣鍑嗐傚浜庢瘡涓鍓嶇宸ョ▼甯鑰岃█,浜嗚В鍩烘湰鐨凣it姒傚康鍜屽伐浣滄祦绋嬩互鍦ㄥ悇绉嶈妯$殑鍥㈤槦涓湁鏁堝伐浣滈兘鏄潪甯搁噸瑕佺殑銆傝繖鏄偍搴旇鐭ラ亾鐨涓浜涙祦琛岀殑Git鍛戒护:gitconfiggitinitgitclonegitstatusgitaddgitcommitgitpushgitpullgitbranch鐭ラ亾杩欎簺鍛戒护鍙互鎻愰珮宸ヤ綔鏁堢巼鎬绘槸寰堥珮鍏寸殑,浣嗘槸鍓嶇宸ョ▼甯堣繕...
  • Web鍓嶇宸ョ▼甯堣鎺屾彙鐨勫伐浣滅粡楠
    绛旓細鐭ラ亾鍙﹀棰嗗煙鐨勯渶姹傚鎴戜滑鑷繁鐨勫伐浣滈潪甯告湁甯姪銆備互涓婂氨鏄皬缂栦粖澶╀负澶у鍒嗕韩鐨勫叧浜Web鍓嶇宸ョ▼甯堣鎺屾彙鐨勫伐浣滅粡楠岀殑鏂囩珷,甯屾湜鏈瘒鏂囩珷鑳藉瀵规鍦ㄤ粠浜媤eb鍓嶇宸ヤ綔鐨勫皬浼欎即浠湁鎵甯姪,鎯宠浜嗚В鏇村web鍓嶇鐭ヨ瘑鐨勫皬浼欎即浠寰楀叧娉ㄥ寳澶ч潚楦焪eb鍩硅瀹樼綉銆傛渶鍚庣鎰垮皬浼欎即浠伐浣滈『鍒! 璇︽儏 瀹樻柟鐢佃瘽 鍦ㄧ嚎瀹㈡湇 瀹樻柟鏈嶅姟 ...
  • Web鍓嶇宸ョ▼甯闇瑕佹帉鎻″摢浜涙妧鑳
    绛旓細web鍓嶇涓昏鎺屾彙璇︽儏椤电殑浜や簰鏁堟灉锛屼互鍙婁笌鍚庣鏈嶅姟鍣ㄧ晠閫氾紝瀹屾垚涓氬姟閫昏緫锛Web鍓嶇宸ョ▼甯鏄腑闂存ˉ姊侊紝闇瑕佸悇鏂归潰瀵规帴锛岄渶瑕佹帉鎻$殑鎶鑳芥瘮杈冨銆1銆乄eb鍓嶇缂栫▼璇█鍜屽紑鍙戞妧鏈紝杩欎簺鏄繀椤昏瀛︿細鐨勶紝鍏朵腑鍖呮嫭锛欳SS銆丠TML銆丄jax銆丣avaScript绛夈2銆佷紭鍖栫綉绔欐ц兘銆丼EO鍜屾湇鍔″櫒绔殑鍩虹鐭ヨ瘑銆3銆佷綔涓虹編鏈紑鍙戜笌鍚庣...
  • 杞web鍓嶇宸ョ▼甯闇瑕佸涔犲摢浜涘唴瀹?
    绛旓細涓撶簿HTML/CSS鐨鍓嶇浠庝笟浜哄憳涔熷氨鏄墠绔噸鏋勩傝繖閲岃鎻愪竴涓嬶紝鏈変竴涓亴涓氬浜庤繖鍧楀緢鏈変紭鍔匡紝閭e氨鏄璁″笀銆備笉绠℃槸UI璁捐甯堬紝杩樻槸骞抽潰璁捐甯堬紝鍦ㄩ〉闈笂濡備綍鍐欓〉闈紝涔鐭ラ亾鎬庝箞鍋氱殑鏇村ソ锛屽苟涓旀洿鍔犵悊瑙Web涓栫晫锛屽仛鍑烘洿“绯荤粺鍖”鐨勮璁°傚叧浜嶤SS鐨勭煡璇嗭紝浣犻渶瑕佺悊瑙f枃妗f祦銆佹诞鍔ㄦ祦绛夊悇绉嶅畾浣嶇殑鏂瑰紡...
  • web鍓嶇宸ョ▼甯閮介渶瑕佸涔犱粈涔?
    绛旓細瑕佹垚涓簑eb鍓嶇宸ョ▼甯堥兘闇瑕佸涔犱粈涔?绗竴锛蹇呴』鎺屾彙鍩烘湰鐨刉eb鍓嶇寮鍙戞妧鏈锛屽叾涓寘鎷細CSS銆丠TML銆丼EO銆丏OM銆丅OM銆丄jax銆丣avaScript绛夛紝鍦ㄦ帉鎻¤繖浜涙妧鏈殑鍚屾椂锛岃繕瑕佹竻妤氬湴浜嗚В瀹冧滑鍦ㄤ笉鍚屾祻瑙堝櫒涓婄殑鍏煎鎯呭喌銆佹覆鏌撳師鐞嗗拰瀛樺湪鐨凚ug銆傜浜岋紝鍦ㄤ竴鍚嶅悎鏍肩殑鍓嶇宸ョ▼甯堢殑鐭ヨ瘑缁撴瀯涓紝缃戠珯鎬ц兘浼樺寲銆丼EO鍜屾湇鍔″櫒绔殑...
  • 扩展阅读:考web前端开发证多少钱 ... 学前端的三大忠告 ... 学了前端一般能干几年 ... 前端自学一般要学多久 ... 前端开发能干到老吗 ... 学生个人网页制作html ... 国家不承认的4种证书 ... 前端和后端哪个前景好 ... 前端工程师月薪多少钱 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网