当前位置: 首页 > Web前端 > JavaScript

【前端面试】高频面试题JavaScript手写代码

时间:2023-03-27 13:48:31 JavaScript

鍓嶈█澶у濂斤紝鎴戞槸姊佹湪鏈夛紝鍗фЫ涓ゅ勾鐨勫簾鏌达紝鍦ㄨ繖瀹跺叕鍙稿伐浣滀簡杩戜袱骞村崐鍗婂勾銆備箣鎵€浠ユ病鏈夊姞钖紝娌℃湁鍗囪亴锛屾病鏈夌寮€锛屾槸鍥犱负宸ヤ綔姘涘洿寰堣垝鏈嶏紝鍒跺害寰堝鏉俱€傝繖涓嶆槸2023骞达紝鎴戝強鏃堕啋鎮燂紝鏈変簡鐩爣锛岀幇鍦ㄦ垜瑕佷负鏄庡勾鎹㈠伐浣滐紝鍋氫竴浜涘噯澶囥€傞鍏堬紝澶嶄範澶嶄範涓€浜涙墜鍐欑殑浠g爜銆傝鐩綍瀹炵幇浜唍ew鍑芥暟锛屽疄鐜颁簡instanceof锛屽疄鐜颁簡call鍑芥暟锛屽疄鐜颁簡apply鍑芥暟锛屽疄鐜颁簡bind鍑芥暟銆俤ebounce闃叉姈鍔熻兘瀹炵幇throttle鍔熻兘瀹炵幇鏁扮粍瀵硅薄鍘婚噸瀹炵幇鏁扮粍鎵佸钩鍖栧疄鐜版繁鎷疯礉1.瑕佸疄鐜皀ew鍔熻兘锛岄鍏堣浜嗚Вnew鏄仛浠€涔堢殑锛氶鍏堝垱寤轰竴涓┖瀵硅薄銆傚皢绌哄璞roto鎸囧悜鏋勯€犲嚱鏁扮殑prototype鍘熷瀷銆傚皢姝ゆ寚鍚戞柊鍒涘缓鐨勫璞★紝骞舵墽琛屾瀯閫犲嚱鏁般€傛墽琛岀粨鏋滄湁杩斿洖鍊间笖鏄璞★紝鍒欒繑鍥炴墽琛岀粨鏋滐紝鍚﹀垯杩斿洖涓€涓柊鍒涘缓鐨勫璞°€?/浠g爜瀹炵幇functionmu_new(fn,...arg){//棣栧厛鍒涘缓涓€涓┖瀵硅薄constobj={};//灏嗙┖瀵硅薄鐨勫師鍨媝roto鎸囧悜鏋勯€犲嚱鏁扮殑鍘熷瀷Object.setPrototypeOf(obj,fn.prototype)//灏唗his鎸囧悜鏂板缓鐨勫璞★紝骞舵墽琛屾瀯閫犲嚱鏁癱onstresult=fn.apply(obj,arg);//鎵ц缁撴灉鏈夎繑鍥炲€间笖鏄璞★紝杩斿洖鎵ц缁撴灉锛屽惁鍒欒繑鍥炴柊寤虹殑ObjectreturnresultinstanceofObject?result:obj;}//楠岃瘉mu_new鍑芥暟functionDog(name){this.name=name;this.say=function(){console.log('鎴戠殑鍚嶅瓧鏄?+this.name);}}constdog=mu_new(Dog,"鍌火煇?);dog.say()//鎴戝彨鍌火煇?銆佸疄鐜癷nstanceof鐨勪紭缂虹偣锛氥€婁紭鐐广€嬶細鍙互鍖哄垎Array銆丱bject鍜孎unction锛岄€傚悎瀵逛簬鍒ゆ柇鑷畾涔夌被瀹炰緥瀵硅薄鐨勨€滅己鐐光€濓細鏃犳硶鍒ゆ柇Number銆丅oolean銆丼tring鍩烘湰鏁版嵁绫诲瀷銆傚疄鐜版楠わ細浼犲叆鐨勫弬鏁版槸宸﹁竟鐨勫疄渚婰锛屽彸杈圭殑鏋勯€犲嚱鏁癛澶勭悊杈圭晫銆傚鏋滆妫€娴嬬殑瀵硅薄鏄竴涓熀鏈被鍨嬬殑returnfalse锛屽彇浼犲叆鍙傛暟鐨刾rototype锛屽垽鏂乏杈圭殑prototype鏄惁涓簄ull銆傚鏋滀负null锛屽垯杩斿洖false锛涘鏋滀袱杈瑰師鍨嬬浉绛夊垯杩斿洖true锛屽惁鍒欑户缁彇宸﹁竟鍘熷瀷鐨勫師鍨嬨€?/杈撳叆鍙傛暟宸﹁竟鏄疄渚婰锛屽彸杈规槸鏋勯€犲嚱鏁癛functionmu_instanceof(L,R){//澶勭悊杈圭晫锛氭鏌ュ疄渚嬬被鍨嬫槸鍚︿负鍘熷绫诲瀷constbaseTypes=['string','鏁板瓧','甯冨皵鍊?,'绗﹀彿','鏈畾涔?];濡傛灉锛坆aseTypes.includes锛坱ypeofL锛墊|L===null锛夎繑鍥瀎alse锛?/鍒嗗埆鍙栦紶鍏ュ弬鏁扮殑鍘熷瀷letLp=L.__proto__;璁㏑p=R.prototype;//鍙湁鍑芥暟鎵嶆湁鍘熷瀷灞炴€?/鍒ゆ柇鍘熷瀷while(true){if(Lp===null)returnfalse;濡傛灉锛圠p===Rp锛夎繑鍥炵湡锛汱p=Lp.__proto__;}}//楠岃瘉constisArray=mu_instanceof([],Array);鎺у埗鍙版棩蹇楋紙isArray锛夛紱//trueconstisDate=mu_instanceof('2023-01-09',Date);鎺у埗鍙版棩蹇楋紙isDate锛夛紱//閿欒3銆傚疄鐜拌皟鐢ㄥ嚱鏁扮殑瀹炵幇姝ラ锛氬鐞嗚竟鐣岋細瀵硅薄涓嶅瓨鍦紝this鎸囧悜window锛涘皢鈥滆皟鐢ㄥ嚱鏁扳€濇寕杞藉埌鈥渢his鎸囧悜鐨勫璞♀€濈殑fn灞炴€с€傚鈥渢his鎸囧悜鐨勫璞♀€濇墽琛宖n鍑芥暟锛屼紶鍏ュ弬鏁帮紝杩斿洖缁撴灉銆侳unction.prototype.mu_call=function(context,...args){//obj涓嶅瓨鍦ㄦ寚鍚戠獥鍙f(!context||context===null){context=window;}//鍒涘缓涓€涓敮涓€鐨勯敭鍊间綔涓烘垜浠瀯閫犱笂涓嬫枃鐨勫唴閮ㄦ柟娉曞悕letfn=Symbol();//this鎸囧悜璋冪敤璋冪敤鐨勫嚱鏁癱ontext[fn]=this;//鎵ц鍑芥暟鍜岃繑鍥炵粨鏋滅浉褰撲簬璋冪敤鑷繁浣滀负浼犲叆涓婁笅鏂囩殑鏂规硶}returncontext[fn](...args);};//娴嬭瘯varvalue=2;varobj1={鍊硷細1,};functionbar(name,age){varmyObj={name:name,age:age,value:this.value,};console.log(this.value,myObj);}bar.mu_call(null);//print2{name:undefined,age:undefined,value:2}閰掑惂銆俶u_call(obj1,'tom','110');//Print1{name:"tom",age:"110",value:1}4銆乤pply鍑芥暟鐨勫疄鐜版楠わ細涓巆all涓€鑷达紝涓庡弬鏁板舰寮忎笉鍚孎unction.prototype.mu_apply=function(context,args){//obj涓嶅瓨鍦ㄦ寚鍚戠獥鍙f(!context||context===null){context=Window;}//鍒涘缓涓€涓敮涓€鐨勯敭鍊间綔涓烘垜浠瀯閫犵殑涓婁笅鏂囧唴閮ㄦ柟娉曞悕letfn=Symbol();//this鎸囧悜鍑芥暟璋冪敤callcontext[fn]=this;//鎵ц鍑芥暟骞惰繑鍥炵粨鏋滅浉褰撲簬璋冪敤鑷繁浣滀负浼犲叆涓婁笅鏂囩殑鏂规硶returncontext[fn](...args);};//testvarvalue=2;varobj1={value:1,};functionbar(name,age){varmyObj={name:name,age:age,value:this.value,};console.log(this.value,myObj);}bar.mu_apply(obj1,["tom","110"]);//print1{name:"tom",age:"110",value:1}5.瀹炵幇缁戝畾鍑芥暟Function.prototype.mu_bind=function(context,...args){if(!context||context===null){context=window;}}//鍒涘缓涓€涓敮涓€鐨勯敭鍊间綔涓烘垜浠瀯閫犵殑涓婁笅鏂囩殑鍐呴儴鏂规硶鍚峫etfn=Symbol();涓婁笅鏂嘯fn]=杩欎釜锛涜_this=杩欎釜锛?/bind绋嶅井澶嶆潅涓€鐐筩onstresult=function(...innerArgs){//绗竴绉嶆儏鍐碉細濡傛灉bind缁戝畾鐨勫嚱鏁颁綔涓烘瀯閫犲嚱鏁帮紝閫氳繃new鎿嶄綔绗︿娇鐢紝閭d箞娌℃湁Bind浼犲叆鐨則his锛宐utpointthistotheinstantiatedobject//姝ゆ椂鐢变簬new鎿嶄綔绗︼紝this鎸囧悜result瀹炰緥瀵硅薄锛宺esult缁ф壙鑷紶鍏ョ殑_this銆傛牴鎹師鍨嬮摼鐨勭煡璇嗭紝鍙互寰楀嚭浠ヤ笅缁撹//this.__proto__===result.prototype//thisinstanceofresult=>true//this.__proto__.__proto__===result.prototype.__proto__===_this.prototype;//thisinstanceof_this=>trueif(thisinstanceof_this===true){//姝ゆ椂this鎸囧悜鎸囧悜result鐨勫疄渚嬶紝姝ゆ椂this鐐逛笉闇€瑕佹敼鍙榯his[fn]=_this;杩欎釜[fn](...[...args,...innerArgs]);//杩欓噷浣跨敤es6鏂规硶璁゜ind鏀寔鍙傛暟鍚堝苟deletethis[fn];}else{//濡傛灉鍙槸浣滀负涓€涓櫘閫氱殑鍑芥暟璋冪敤鐨勮瘽锛岃皟鐢ㄨ捣鏉ラ潪甯哥畝鍗曘€傜洿鎺ユ妸杩欎釜鐐规敼鎴愪紶鍏ヤ笂涓嬫枃context[fn](...[...args,...innerArgs]);鍒犻櫎涓婁笅鏂嘯fn]锛泒};//濡傛灉bound鏄瀯閫犲嚱鏁帮紝閭d箞闇€瑕佺户鎵挎瀯閫犲嚱鏁板師鍨嬬殑灞炴€у拰鏂规硶//瀹炵幇缁ф壙鐨勬柟寮忥細浣跨敤Object.createresult.prototype=Object.create(this.prototype);杩斿洖缁撴灉锛泒;functionPerson(name,age){console.log(name);//'鎴戞槸鍙傛暟浼犲叆鐨勫悕瀛?console.log(age);//'鎴戞槸鍙傛暟浼犲叆鐨勫勾榫?console.log(this);//鏋勯€犲嚱鏁皌his鎸囧悜瀹炰緥瀵硅薄}//鏋勯€犲嚱鏁板師鍨嬬殑鏂规硶Person.prototype.say=function(){console.log(123);};//姝e父鍑芥暟functionnormalFun(name,age){console.log(name);//'鎴戞槸鍙傛暟浼犲叆鐨勫悕瀛?console.log(age);//'鎴戞槸鍙傛暟浼犲叆鐨勫勾榫?console.log(this);//鏅€氬嚱鏁皌his鎸囧悜缁戝畾bind鐨勭涓€涓弬鏁扮ず渚嬩腑鐨刼bjconsole.log(this.objName);//'鎴戞槸obj浼犲叆鐨勫悕瀛?console.log(this.objAge);//'鎴戞槸obj浼犲叆鐨勫勾榫?}letobj={objName:'鎴戞槸obj浼犲叆鐨勫悕瀛?,objAge:'鎴戞槸obj浼犲叆鐨勫勾榫?,};//棣栧厛浣滀负鏋勯€犲嚱鏁拌皟鐢ㄨ繘琛屾祴璇?/letbindFun=Person.mu_bind(obj,'鎴戞槸鍙傛暟浼犲叆鐨勫悕瀛?;//leta=newbindFun('鎴戞槸鍙傛暟浼犲叆鐨勫勾榫?);//a.say();//123//浣滀负鏅€氬嚱鏁拌皟鐢ㄥ啀娆℃祴璇昦;letbindFun=normalFun.mu_bind(obj,'鎴戞槸鍙傛暟浼犲叆鐨勫悕瀛?);bindFun('鎴戞槸骞撮緞鍙傛暟浼犲叆');6.瀹炵幇debounce闃叉姈鍔熻兘璇ュ姛鑳介槻鎶栨槸鍦ㄤ簨浠惰Е鍙憂绉掑悗鎵ц鍥炶皟锛屽鏋滄槸鈥渘绉掑唴鍐嶆瑙﹀彂鈥濓紝鍒欌€渞etime鈥濆嚱鏁癲ebounce(fn,wait){lettimer=null;returnfunction(){if(timer!=null){clearTimeout(timer);}timer=setTimeout(()=>{fn();},wait);};}//娴嬭瘯鍑芥暟handle(){console.log(Math.random());鎽囨檭锛屾墽琛宧andlewindow.addEventListener('resize',debounce(handle,1000));7.瀹炵幇娌归棬鍔熻兘銆傚綋浜嬩欢琚Е鍙戞椂锛屼繚璇佽鍑芥暟鍦ㄤ竴瀹氭椂闂村唴鍙璋冪敤涓€娆°€傛瘮濡傞〉闈㈡粴鍔ㄦ椂锛屾瘡闅斾竴娈垫椂闂村彂閫佷竴娆¤姹傜殑瀹炵幇姝ラ锛氬叆鍙備负鎵ц鍑芥暟fn锛岀瓑寰呮椂闂翠负wait銆傜幇鍦ㄤ繚瀛樺垵濮嬫椂闂淬€傝繑鍥炰竴涓嚱鏁般€傚鏋滆秴杩囩瓑寰呮椂闂达紝鍒欐墽琛屽嚱鏁板苟绔嬪嵆鏇存柊涓哄綋鍓嶆椂闂淬€俧unctionthrottle(fn,wait,...args){varpre=Date.now();returnfunction(){//鍑芥暟鍙兘鏈夎緭鍏ュ弬鏁皏arcontext=this;varnow=Date.now();if(now-pre>=wait){//灏嗘墽琛屽嚱鏁扮殑this鎸囧悜褰撳墠浣滅敤鍩焒n.apply(context,args);pre=Date.now();}};}//娴嬭瘯varname='mu';鍑芥暟鍙ユ焺锛坴al锛墈console.log锛坴al+this.name锛夛紱}//婊氬姩榧犳爣锛岃Е鍙戦槻鎶栵紝鎵цhandlewindow.addEventListener('scroll',throttle(handle,1000,'Wood'));8.瀹炵幇鏁扮粍瀵硅薄鍘婚噸銆俶ap鐨刱ey涓嶈兘閲嶅锛屽幓鎺夌浉鍚屽睘鎬х殑itemfunctionuniqBy(arr,key){return[...newMap(arr.map((item)=>[item[key],item])).鍊?)];}constlist=[{id:1,name:'tom'},{id:1,name:'jey'},{id:2,name:'joy'},];console.log(uniqBy(list,'id'));//[{id:1,name:"jey"},{id:2,name:"joy"}]9.瀹炵幇鏁扮粍flatletflatletarr=[1,2,[3,4],[5,6,[7,8,9]]]console.log(arr.flat(Infinity))//[1,2,3,4,5,6,7,8,9]join/splitletarr=[1,2,[3,4],[5,6,[7,8,9]]]console.log(arr.toString().split(",").map(Number))//[1,2,3,4,5,6,7,8,9]console.log(arr.join().split(",").map(Number))//[1,2,3,4,5,6,7,8,9]鍑芥暟鐗堟湰letarr=[1,2,[3,4],[5,6,[7,8,9]]]functionflatter(arr){濡傛灉(!arr.length)杩斿洖锛泈hile(arr.some((item)=>Array.isArray(item))){arr=[].concat(...arr);}杩斿洖arr;}//console.log(flatter([1,2,[1,[2,3,[4,5,[6]]]]]));10.瀹炵幇娣辨嫹璐濆璞$殑娣辨嫹璐濓紝鏈川涓婃槸涓€绉嶉€掑綊鐨勬柟娉曟潵瀹炵幇娣卞厠闅嗭細閬嶅巻瀵硅薄鍜屾暟缁勭洿鍒伴兘鏄熀鏈暟鎹被鍨嬶紝鐒跺悗杩涜鎷疯礉绠€鍗曠増functiondeepCopy(obj){//鍒ゆ柇鏄惁涓虹畝鍗曟暟鎹被鍨嬶紝if(typeofobj=="object"){//澶嶆潅鏁版嵁绫诲瀷varresult=obj.constructor==Array?[]锛歿}锛沠or(letiinobj){result[i]=typeofobj[i]=="object"?deepCopy(obj[i]):obj[i];}}else{//绠€鍗曟暟鎹被鍨嬬洿鎺?=璧嬪€紇arresult=obj;}returnresult;}杩涢樁鐗坒unctiondeepClone(obj,hash=newWeakMap()){//濡傛灉涓簄ull鎴杣ndefined锛屽垯涓嶆墽琛屽鍒舵搷浣渋f(obj==null)returnobj;if(objinstanceofDate)returnnewDate(obj);if(objinstanceofRegExp)returnnewRegExp(obj);//鍙互鏄璞′篃鍙互鏄櫘閫氬€笺€傚鏋滄槸鍑芥暟锛屽垯涓嶉渶瑕佹繁鎷疯礉if(typeofobj!=='object')returnobj;//濡傛灉鏄璞★紝鍒欓渶瑕佹繁鎷疯礉if(hash.get(obj))returnhash.get(obj);//鎵惧埌绫诲師鍨嬩笂鐨勬瀯閫犲嚱鏁帮紝鍘熷瀷涓婄殑鏋勯€犲嚱鏁版寚鍚戝綋鍓嶇被鏈韩letcloneObj=newobj.constructor();hash.set(obj,cloneObj);for(letkeyinobj){if(obj.hasOwnProperty(key)){//瀹炵幇閫掑綊澶嶅埗cloneObj[key]=deepClone(obj[key],hash);}}returncloneObj;}letobj={name:1,address:{x:100}};obj.o=obj;//瀵硅薄鏈夊惊鐜紩鐢╨etd=deepClone(obj);obj.address.x=200锛涘畨鎱般€傝褰曪紙d锛夛紱