2025年金三銀四前端面試題簡(jiǎn)答版及答案_第1頁(yè)
2025年金三銀四前端面試題簡(jiǎn)答版及答案_第2頁(yè)
2025年金三銀四前端面試題簡(jiǎn)答版及答案_第3頁(yè)
2025年金三銀四前端面試題簡(jiǎn)答版及答案_第4頁(yè)
2025年金三銀四前端面試題簡(jiǎn)答版及答案_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2025年金三銀四前端面試題簡(jiǎn)答版及答案Q:JavaScript中原型鏈的本質(zhì)是什么?如何通過原型鏈實(shí)現(xiàn)繼承?A:原型鏈的本質(zhì)是對(duì)象之間的關(guān)聯(lián)體系,通過`__proto__`屬性連接。每個(gè)對(duì)象(除`null`)的`__proto__`指向其構(gòu)造函數(shù)的`prototype`對(duì)象,形成鏈?zhǔn)浇Y(jié)構(gòu)。當(dāng)訪問對(duì)象屬性時(shí),若當(dāng)前對(duì)象無(wú)該屬性,會(huì)沿`__proto__`向上查找,直到找到或到達(dá)`Ototype.__proto__`(即`null`)。實(shí)現(xiàn)繼承時(shí),可通過`Object.create()`將子類構(gòu)造函數(shù)的`prototype`指向父類實(shí)例,或使用`classextends`語(yǔ)法(本質(zhì)是原型鏈繼承+構(gòu)造函數(shù)屬性復(fù)制)。Q:閉包的定義、形成條件及實(shí)際應(yīng)用場(chǎng)景?A:閉包是函數(shù)與其詞法環(huán)境的組合,允許函數(shù)訪問其定義時(shí)所在作用域的變量,即使該函數(shù)在原作用域之外執(zhí)行。形成條件:函數(shù)嵌套(內(nèi)部函數(shù)引用外部函數(shù)變量)、內(nèi)部函數(shù)在外部函數(shù)執(zhí)行后仍被保留(如作為返回值或事件回調(diào))。應(yīng)用場(chǎng)景包括:封裝私有變量(如模塊模式)、實(shí)現(xiàn)函數(shù)記憶(緩存計(jì)算結(jié)果)、延遲執(zhí)行(事件處理函數(shù)保留外部狀態(tài))。需注意閉包可能導(dǎo)致內(nèi)存泄漏,需及時(shí)解除引用。Q:如何用Promise實(shí)現(xiàn)一個(gè)并發(fā)請(qǐng)求控制函數(shù),限制同時(shí)執(zhí)行的請(qǐng)求數(shù)?A:核心思路是維護(hù)任務(wù)隊(duì)列和當(dāng)前執(zhí)行數(shù),每次執(zhí)行任務(wù)時(shí)若未達(dá)上限則立即執(zhí)行,否則加入隊(duì)列;任務(wù)完成后從隊(duì)列取出下一個(gè)執(zhí)行。示例邏輯:```javascriptfunctionconcurrentRequest(tasks,max){letactive=0;constqueue=[...tasks];returnnewPromise(resolve=>{construn=async()=>{if(queue.length===0&&active===0){resolve();return;}while(active<max&&queue.length>0){active++;consttask=queue.shift();try{awaittask();}finally{active--;run();}}};run();});}```Q:Vue3響應(yīng)式系統(tǒng)中,Ref和Reactive的區(qū)別及使用場(chǎng)景?A:`reactive`用于對(duì)象(包括數(shù)組、Map等)的響應(yīng)式轉(zhuǎn)換,基于`Proxy`攔截所有屬性操作;`ref`用于基本類型(如`number`、`string`)或?qū)ο蟮捻憫?yīng)式封裝,內(nèi)部通過`value`屬性暴露值,訪問時(shí)需`.value`(模板中可省略)。場(chǎng)景差異:基本類型用`ref`(因`reactive`無(wú)法直接處理),對(duì)象/數(shù)組用`reactive`更直觀;組合式API中,若需在函數(shù)間傳遞響應(yīng)式變量,`ref`更方便(避免解構(gòu)導(dǎo)致響應(yīng)丟失)。Q:React中useEffect的依賴數(shù)組為空、包含變量、省略時(shí)的執(zhí)行邏輯?A:依賴數(shù)組為空時(shí),僅在組件掛載(mount)和卸載(unmount)時(shí)執(zhí)行(類似`componentDidMount`+`componentWillUnmount`);包含變量時(shí),變量變化或組件更新且變量值變化時(shí)重新執(zhí)行;省略依賴數(shù)組時(shí),每次組件渲染后都執(zhí)行(類似`componentDidUpdate`)。需注意:若依賴項(xiàng)為對(duì)象/數(shù)組,需確保引用穩(wěn)定(如用`useMemo`緩存),否則可能導(dǎo)致不必要的重復(fù)執(zhí)行。Q:如何優(yōu)化前端首屏加載速度?請(qǐng)列出至少5種具體方法。A:(1)路由懶加載:使用`React.lazy`或`Vue異步組件`,按需加載非首屏路由;(2)資源壓縮:通過`Terser`壓縮JS、`ImageOptim`壓縮圖片,啟用Gzip/Brotli服務(wù)器壓縮;(3)CDN加速:將靜態(tài)資源(JS/CSS/圖片)托管到CDN,利用邊緣節(jié)點(diǎn)降低延遲;(4)預(yù)加載關(guān)鍵資源:用`<linkrel="preload">`優(yōu)先加載首屏關(guān)鍵JS/CSS;(5)減少阻塞渲染的資源:將非關(guān)鍵CSS改為`media="print"`或動(dòng)態(tài)加載,JS添加`async`/`defer`屬性;(6)服務(wù)端渲染(SSR):直接返回渲染后的HTML,減少客戶端JS執(zhí)行時(shí)間。Q:TypeScript中接口(Interface)和類型別名(TypeAlias)的主要區(qū)別?A:(1)擴(kuò)展方式:接口可通過`extends`繼承其他接口,支持多次聲明合并;類型別名需通過`&`交叉類型實(shí)現(xiàn)類似繼承,無(wú)法合并;(2)定義范圍:接口只能定義對(duì)象/函數(shù)/類的結(jié)構(gòu);類型別名可定義基本類型(如`typeID=string`)、聯(lián)合類型(`typeA|B`)、元組(`typeTuple=[number,string]`)等更靈活;(3)與類的關(guān)系:接口可被類`implements`實(shí)現(xiàn),類型別名不行;(4)編譯產(chǎn)物:接口在TS編譯后會(huì)被移除,類型別名可能保留(如作為注釋)。Q:Webpack中l(wèi)oader和plugin的區(qū)別?如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的loader?A:loader是文件轉(zhuǎn)換器,用于處理非JS模塊(如將TS轉(zhuǎn)JS、Sass轉(zhuǎn)CSS),運(yùn)行在模塊加載階段,按配置順序從右到左/從下到上執(zhí)行;plugin是擴(kuò)展器,用于處理更廣的場(chǎng)景(如代碼壓縮、資源拷貝、環(huán)境變量注入),通過鉤子(hooks)介入整個(gè)編譯周期。實(shí)現(xiàn)loader需導(dǎo)出一個(gè)函數(shù),接收源文件內(nèi)容(或前一個(gè)loader的輸出),返回轉(zhuǎn)換后的內(nèi)容(同步或異步)。示例(去除注釋的loader):```javascriptmodule.exports=function(content){returncontent.replace(/\/\/.|\/\[\s\S]?\\//g,'');};```Q:HTTP/3相比HTTP/2有哪些核心改進(jìn)?A:(1)底層協(xié)議:HTTP/3基于QUIC(快速UDP互聯(lián)網(wǎng)連接),替代HTTP/2的TCP;(2)解決隊(duì)頭阻塞:TCP連接中單個(gè)數(shù)據(jù)包丟失會(huì)阻塞后續(xù)包處理,QUIC通過多路復(fù)用(每個(gè)流獨(dú)立)避免此問題;(3)更快連接建立:QUIC基于UDP,首次連接僅需1RTT(往返時(shí)間),后續(xù)連接通過連接ID復(fù)用會(huì)話,無(wú)需重新握手;(4)更靈活的流量控制:QUIC內(nèi)置加密(TLS1.3)和流量控制機(jī)制,減少額外開銷。Q:實(shí)現(xiàn)一個(gè)數(shù)組扁平化函數(shù),要求支持指定展開深度,如flatten([1,[2,[3,[4]],5]],2)輸出[1,2,3,[4],5]。A:遞歸實(shí)現(xiàn),通過參數(shù)控制當(dāng)前剩余深度:```javascriptfunctionflatten(arr,depth=1){returnarr.reduce((acc,cur)=>{if(Array.isArray(cur)&&depth>0){returnacc.concat(flatten(cur,depth-1));}else{returnacc.concat(cur);}},[]);}```Q:Vue3組合式API(Composables)相比選項(xiàng)式API(OptionsAPI)的優(yōu)勢(shì)?A:(1)邏輯復(fù)用:組合式API通過函數(shù)封裝可復(fù)用邏輯(如`useFetch`),避免選項(xiàng)式API中`mixins`的命名沖突和來(lái)源不清晰問題;(2)代碼組織:按邏輯功能拆分(如將狀態(tài)管理、副作用、計(jì)算屬性放在同一函數(shù)),提升可讀性;(3)類型推導(dǎo):TS對(duì)組合式API的支持更友好(如函數(shù)參數(shù)/返回值可明確類型),選項(xiàng)式API中`this`的類型推導(dǎo)較復(fù)雜;(4)性能優(yōu)化:組合式API在編譯時(shí)更易進(jìn)行樹搖(TreeShaking),減少冗余代碼。Q:React中如何避免不必要的組件重新渲染?A:(1)使用`React.memo`包裹函數(shù)組件,淺比較`props`變化(需配合`useMemo`緩存對(duì)象/數(shù)組類型的`props`);(2)類組件繼承`PureComponent`,自動(dòng)淺比較`state`和`props`;(3)`useCallback`緩存函數(shù)類型的`props`,避免父組件渲染導(dǎo)致子組件`props`變化;(4)拆分組件粒度,將穩(wěn)定部分和變化部分分離,減少渲染影響范圍;(5)使用`shouldComponentUpdate`(類組件)自定義更新邏輯。Q:CSS中BFC(塊格式化上下文)的觸發(fā)條件及應(yīng)用場(chǎng)景?A:觸發(fā)條件:`float`不為`none`、`position`為`absolute`/`fixed`、`display`為`inline-block`/`table-cell`/`flex`/`grid`、`overflow`不為`visible`。應(yīng)用場(chǎng)景:(1)解決浮動(dòng)元素導(dǎo)致的父容器高度塌陷(父元素觸發(fā)BFC包含浮動(dòng)子元素);(2)避免相鄰塊級(jí)元素的`margin`重疊(同一BFC內(nèi)的相鄰元素`margin`會(huì)合并,不同BFC不會(huì));(3)防止文字環(huán)繞(BFC元素與浮動(dòng)元素互不干擾)。Q:如何實(shí)現(xiàn)一個(gè)線程安全的localStorage(支持多標(biāo)簽頁(yè)同步且避免競(jìng)態(tài)條件)?A:核心思路:(1)利用`storage`事件監(jiān)聽其他標(biāo)簽頁(yè)的修改;(2)通過`sessionStorage`或`indexedDB`結(jié)合鎖機(jī)制(如時(shí)間戳+隨機(jī)數(shù))處理并發(fā)寫入。示例步驟:-寫入時(shí)提供唯一標(biāo)識(shí)(如`token`)和時(shí)間戳,檢查當(dāng)前是否有未過期的鎖(通過比較時(shí)間戳);-若無(wú)鎖,寫入數(shù)據(jù)并設(shè)置鎖(記錄`token`和過期時(shí)間);-其他標(biāo)簽頁(yè)通過`storage`事件監(jiān)聽變化,若檢測(cè)到自己的`token`被覆蓋,觸發(fā)沖突處理邏輯;-讀取時(shí)優(yōu)先使用內(nèi)存緩存(如`Map`),減少`localStorage`讀取次數(shù)。Q:簡(jiǎn)述Webpack5的持久化緩存(PersistentCaching)實(shí)現(xiàn)原理及配置方法?A:原理:將編譯過程中模塊的處理結(jié)果(如JS解析后的AST、loader處理后的代碼)緩存到磁盤,下次編譯時(shí)若模塊未變化(通過`contenthash`或`mtime`判斷),直接使用緩存結(jié)果,減少重復(fù)計(jì)算。配置方法:```javascript//webpack.config.jsmodule.exports={cache:{type:'filesystem',//啟用文件系統(tǒng)緩存buildDependencies:{config:[__filename]//配置文件變化時(shí)緩存失效},version:'1.0'//手動(dòng)指定版本,版本變化時(shí)緩存重置}};```Q:實(shí)現(xiàn)一個(gè)函數(shù),判斷兩個(gè)對(duì)象是否深度相等(考慮數(shù)組、普通對(duì)象、Date、RegExp等特殊對(duì)象)。A:需分類型處理,遞歸比較:```javascriptfunctiondeepEqual(a,b){if(a===b)returntrue;//基本類型或同一引用if(typeofa!=='object'||typeofb!=='object'||a===null||b===null)returnfalse;//處理特殊對(duì)象if(ainstanceofDate&&binstanceofDate)returna.getTime()===b.getTime();if(ainstanceofRegExp&&binstanceofRegExp)returna.toString()===b.toString();//檢查構(gòu)造函數(shù)(避免不同構(gòu)造函數(shù)的對(duì)象,如[]和newArray)if(a.constructor!==b.constructor)returnfalse;//處理數(shù)組或?qū)ο骳onstkeysA=Object.keys(a),keysB=Object.keys(b);if(keysA.length!==keysB.length)returnfalse;returnkeysA.every(key=>deepEqual(a[key],b[key]));}```Q:Vue3中如何實(shí)現(xiàn)自定義指令(Directive)?生命周期鉤子有哪些?A:通過`app.directive(name,definition)`注冊(cè),`definition`對(duì)象包含生命周期鉤子:-`beforeMount`:指令綁定到元素且父元素掛載前;-`mounted`:元素掛載到DOM后;-`beforeUpdate`:元素更新前(包括子元素);-`updated`:元素更新后;-`beforeUnmount`:元素卸載前;-`unmounted`:元素卸載后。示例(輸入框自動(dòng)聚焦):```javascriptapp.directive('focus',{mounted(el){el.focus();}});```Q:ReactFiber架構(gòu)的核心目標(biāo)及工作原理?A:核心目標(biāo):解決舊版調(diào)和(Reconciliation)過程中同步遞歸導(dǎo)致的長(zhǎng)任務(wù)阻塞(頁(yè)面卡頓),通過可中斷、可恢復(fù)的異步更新提升用戶體驗(yàn)。工作原理:-將更新任務(wù)拆分為多個(gè)“工作單元”(Fiber節(jié)點(diǎn)),每個(gè)單元記錄組件類型、狀態(tài)、副作用等;-使用`requestIdleCallback`(或`requestAnimationFrame`)在瀏覽器空閑時(shí)執(zhí)行任務(wù),優(yōu)先級(jí)高的任務(wù)(如用戶輸入)可中斷低優(yōu)先級(jí)任務(wù);-通過雙緩沖(DoubleBuffer)技術(shù)維護(hù)當(dāng)前渲染樹(`current`)和工作中的渲染樹(`workInProgress`),完成所有更新后交換兩者,減少DOM操作次數(shù)。Q:如何利用ServiceWorker實(shí)現(xiàn)離線應(yīng)用?關(guān)鍵步驟有哪些?A:關(guān)鍵步驟:(1)注冊(cè)ServiceWorker:在頁(yè)面JS中通過`navigator.serviceWorker.register('/sw.js')`注冊(cè),需HTTPS(本地開發(fā)可使用`localhost`);(2)安裝階段(`install`事

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論