Interview Questions
HTML & CSS
-
什麼是 box model? CSS 中的 box-sizing 又是什麼?
- box model: 所有的 HTML elements都可以被想像成一個box, 且box model描述box的design和layout

-
display: inline 和 display: block 的差異?
- display: inline-> element寬高是多少就是多少,不佔據一整行
- display: block-> element佔據一整行
-
display: none 和 visibility: hidden 的差異?
- display: none -> 瀏覽器畫面上隱藏, 並且不佔位置
- visibility: hidden -> 瀏覽器畫面上隱藏, 但佔位置
-
div 和 span 的差異?
- div -> 佔據一整行,有margin可用
- span -> 不佔據一整行,且沒有margin可用
-
px, em, rem 的差異?
- px -> 絕對單位,代表螢幕中每個「點」( pixel )
- em -> 相對單位,每個子元素透過「倍數」乘以父元素的 px 值
- rem -> 相對單位,每個元素透過「倍數」乘以根元素的 px 值
- % -> 相對單位,每個子元素透過「百分比」乘以父元素的 px 值
-
試著說明 flex box 的用法
JavaScript
- null 和 undefined 的差異?
- null -> 有宣告一個value, 只是這個value是null(空), typeof 是 false
- undefined -> 有宣告一個value記憶體位置, 但這個記憶體位置沒assign值, typeof 是undefind
- 什麼是 NaN?在什麼情況下會出現 NaN?如何偵測變數中的資料是 NaN?
- 解釋 Primitive 和 Reference Data Type 的差別?
- js可以自動garbage collection回收記憶體位置
- 使用 var, let, const 宣告變數有什麼差別?
- 什麼是 Closure?能否舉例說明?
- 閉包 (Closure): 是一種函式, 此函式可以存取外層變數,以及函式可以作為回傳值, 進而「保留」環境。
- 試說明 hoisting 的現象?
- hoisting(提升):先宣告再執行, 幫你留位子的意思
Javascript 在執行任何程式碼之前,先把宣告的變數和函式放進記憶體空間裡,就像是事先幫他們留個位子的感覺。
- undefined 跟 is not defined 是不一樣的錯誤,undefined 的意思是「我不知道他的值是多少」,is not defined 是「未宣告」的意思,Javascript 給已宣告未賦值的變數或是函數的預設值都是 undefined
Browser & Network
-
試說明事件傳遞(event propagation)的流程?
- 先捕獲(CAPTURING_PHASE),再冒泡(BUBBLING_PHASE)

-
試說明事件物件(event object) target 和 currentTarget 的差別
- e.currentTarget:指的是綁監聽事件的物件
- e.target:指的是實際觸發事件的物件
-
什麼是 RESTful API,能否分享你串接 RESTful API 的經驗?
- 語義化的API能看出要對什麼資料、進行什麼操作 (ex: get, post, put, delete)
-
HTTP 和 websocket 有什麼不一樣?
- websocket: 瀏覽器和伺服器只需要完成一次交握,兩者之間就可以建立永續性的連接,並進行雙向資料傳輸。
- HTTP: 是單向傳輸, client發出request, server回response, 不支持永久連接
-
什麼是 cookie?試說明 cookie 的運作方式?
- 儲存在使用者電腦上的小檔案,協助儲存所造訪網頁上的偏好和其他資訊
-
什麼是 web storage?和 cookie 有什麼差別?
-
event delegation好處與限制?
- 好處:將事件綁在parent就不用把事件綁在每個child上, 減少事件綁定
- 限制:如果child停止傳遞就無法使用了
-
stopPropagation 或 stopImmediatePropagation?
- 前者只會防止目前 Dom Tree 的上一層事件,後者則是會防止全部 Dom Tree 事件
React
-
什麼是 virtual DOM?
- Virtual DOM,中文翻譯叫做虛擬 DOM,顧名思義,他不是一個真正的 DOM, 是一個 JavaScript 的物件,存在在 memory 當中, 前端框架在設計與實作上,會先將原本的 DOM 結構複製一份出來,但不會完整複製 DOM 當中的所有資訊。每當有事件產生,或是資料變動的時候,前端框架會先建立一個新的 virtual DOM,接著,計算出新舊 virtual DOM 之間的差別,最後才會操作真正的 DOM,並僅僅操作有變動的部分,藉此避免不必要的 reflow 或 repaint 以提升效能, 而這個過程就叫reconciliation「和解」或「調停」、「重新建立關係」的意思。
-
試說明 props 和 state 的差異?
- props是父層傳給子層的value
- state是component內暫存value
-
試說明 class component 的生命週期?
- Mount:初始化階段(只執行一次)
- constructor
- getDerivedStateFromProps
- render
- componentDidMount
- Update:組件更新階段
- getDerivedStateFromProps
- shouldComponentUpdate
- render
- getSnapshotBeforeUpdate
- componentDidUpdate
- Unmount:組件卸載階段(只執行一次)
-
什麼是 props drilling?如何解決這樣的問題?
- 曾曾曾祖父的值要傳到孫子, 需要一直傳下去
- 用useContex provider state 給所有子層或子孫曾都可以使用到values, 不用靠props一層層傳下去


-
什麼是 react router 嗎?react router 是想解決什麼樣的問題?
- 路由
- 實現SPA:
- 把所有資料都放在同一個頁面,不需要換頁,使用者可以在單一頁面裡瀏覽全部內容,也就是說只會有一個index.html 檔
- 透過 AJAX 技術,client 可以向 server 發出非同步請求,索取局部內容的資料進行抽換,降低每次請求與回應的資料量,提高瀏覽速度
-
有使用過任何 react 相關的套件嗎?你如何選擇以及如何使用?
-
解釋 useEffect 的用法
- render component時執行一次, 或是dependence改變再重新執行, 又或是沒有[]時一直執行
-
解釋 useReducer 的用法
- dispatch action, update state
-
解釋 useCallback 的用法
- 記住function, 希望function只宣告一次或是dependence改變再重新宣告
-
解釋 useMemo 的用法
- 記住value, component內有複雜的計算, 希望計算的值只計算一次或是dependence改變再重新計算
-
解釋 memo 的用法
- 希望render父層的時候子層的component不要render時用memo
-
什麼時候會用到 key? 為什麼需要?
- 用map render item的時候, 需要標記item讓user可以對item操作
-
context:主要是為了解決props要一層一層傳遞
- 放在父層, 有使用到的child會re-render
-
react vs react dom
- react:主要核心功能
- react dom: 實際真的去操作更新 dom
-
useEffect vs useLayoutEffect
-
module, script, script type=module有什麼差異?
- module: 在module裡面宣告的變數只有module可以用
- script: 裡面的變數全域都可以拿到
- script type=module:
- script type=module只能透過server打開, 不能用http打開
- type=module會自動是stric mode
Code Quality
-
什麼是 eslint?有沒有設定過 eslint config 的經驗?
-
什麼是 refactor?你怎麼做 refactor?
- 重構是不影響城市功能的情況下優化程式碼
- 把程式碼做優化重複的code抽出來, function參數控制在3個以內, 讓程式碼好維護好閱讀
-
知道 git flow 嗎?你如何在開發過程中使用 git 做版本控制?
- 開發流程, master, develop, feature1 2 3, hot-fix
-
git merge 和 git rebase 有何差別?
- git merge
- pros: 紀錄非常詳盡,有助於了解每次合併發生的方式和時間的完整歷史, 很容易發現錯誤並解決它們
- cons: 導致笨拙的歷史記錄, 不是很人性化

- git rebase
- pros: 紀錄是線性的
- cons: 無法追蹤提交在目標分支上合併的時間和方式

-
怎樣是好的 commit message?如何整理自己的 commit?
- 清楚描述做的事情
- 盡量清楚描述做的事情, commit要做的事情切乾淨