EP10 - 常見的前端面試題目以及能怎麼回答,可能是part 1
上禮拜在社群上和朋友做模擬面試
感覺成效還挺好的
這次是用英文面試而且比較像是北美的面試狀況
給大家一些idea國外大概怎麼面試
同一天有另一場中文的面試
有感覺台灣面試和北美真的不太一樣
今天講講一些比較常見的面試題目然後我覺得大方向可以怎麼回答
雖然不保證你下次會遇到一樣的題目而且其實也不保證你這樣回答對方會滿意
但這邊給個大方向和一些關鍵字讓你可以更完整回答問題
setTimeout / Event Loop
我自己沒遇過但網上和instagram上面蠻多人說面試被問到這題
問題的包裝可能會像是JavaScript是不是multi threaded或是setTimeout運作原理
或是直接問event loop是什麼
event loop是個JS的機制決定跑function的先後順序
以setTimeout為例子
當我們的code叫了setTimeout這個function call會先放到call stack
那因為是stack 所謂的 last in first out所以越後面叫的會越先被處理
假設現在換setTimeout了因為我們叫的是Web API所以會讓browser去處理這個以及開始一個timer
等timer時間到 會把setTimeout裡面的callback function放進task queue
這邊注意的是它不是直接放進stack因為怕打亂叫的順序造成奇怪的事情發生
所以放進一個queue等event loop處理完stack再把queue的東西放進去
Promise
Promise可能大部分是考定義和為什麼要去用它
有些人好像被考過要當成手寫Promise長什麼樣子
什麼 new Promise加resolve和reject這樣
然後要用then或是async await去等它
目前API只要不是可以同步馬上給你的通常都會給你一個Promise
最好的例子就是就是fetch因為它得等server回傳response回來但不知道什麼時候會回來
順帶一提event loop有個micro task queue是用來存Promise的而且優先權比task queue高
Cookies / Local Storage / Session Storage
這三個其實都能做到存資料的用途不過也會根據你想做的事情來做區分
這邊大概講一下區別
Cookies和其他storage比能存的data只有 4 KB
我們可以在這些data上放一個過期的時間
時間到了就會自動刪掉
不只有前端可以操作cookie裡面的東西 server也可以存取和更新cookies的東西
然後每個request中跟這個domain在一起的cookies都會被上傳上去
因為這個便利性所以常常把cookies當作存放auth token的地方
不過也因為這樣也要小心裡面放什麼要不然會有安全性的顧慮
Locale Storage Session Storage 可以存放5 MB的資料
只有前端可以讀取而且如果沒有去刪它就會一直留著
Session Storage不一樣的點是你的tab關掉那些data就不見了而local會一直留著
效能優化
這個可以講的點很多 反正主要就是怎麼讓網頁跑起來變快
JavaScript 方面可以是整體size儘量小一點 選比較不肥的library 然後做code spliting確保只跑需要跑的code lazy load剩下的東西
有些module需要花時間跑起來的可以等晚一點或是等有互動了才開始跑
現在build tool都很智能會儘量幫忙做tree shaking把沒用到的code刪掉
然後儘量不要做會block UI thread的事情比如大量的運算
資料量大的時候 如果server支援那在前端記得做pagination
CSS可以做audit把你沒有用到的rule刪掉
在HTML上面把一些比較重要的CSS font 圖片設定比較高的priority讓瀏覽器先下載他們
server用http 2甚至3來讓你可以在短時間下載很多檔案
利用gzip和brotli來壓縮你的檔案
運用CDN來存取這些檔案讓使用者在最短的時間可以下載到這些js css
剛才講的這些其實有些CDN都幫你弄好了但講一下CDN做了什麼事情也代表說你不是只知道前端UI的東西
Vue, React 這些框架是做什麼的
任何框架都是想把一些事情簡單化和規格化
那前端框架就是想把拿到資料然後有效率的放在畫面上這件事情做到很簡單
而且也幫助我們可以重複使用我們寫的UI或是component
再細一點可以講到他們怎麼render怎麼把事情變簡單的
比如手寫的話我們需要自己fetch 然後用Web API去抓DOM和create那些DOM
這些框架有自己一套機制知道當data更新時候要更新哪些DOM
我們不用特別的追蹤這些binding
加上框架也會用很有效率的方式來batch更新而不會消耗太多的資源
那React基本上是整個component重新render
而像Solid這類或是Vue好像也是可以精準的知道哪一個DOM需要被更新
其他我比較會看對方resume來問問題
比如有講到測試我會問對方都怎麼測試或是 unit test 和 e2e有什麼不同
對方用過docker做deployment我就會問為什麼要用docker
寫了效能優化很多我就會想知道細節
一方面聽聽看是不是真的對方做的 一方面聊細節然後知道對方怎麼做這些決定的
如果你喜歡這內容的話幫我在 Twitter 和 Threads 上面分享給其他正在前端這條路上努力的朋友們,也別忘了訂閱我們電子報收到第一手消息喔 🚀