---
# System prepended metadata

title: 面試考題整理

---

# 面試考題整理

### 1. [MVC、AJAX、SPA、MPA 與 SSR](https://hulitw.medium.com/introduction-mvc-spa-and-ssr-545c941669e9)

- MVC(Model–view–controller) 是一種程式架構模式，是指將 **Model模型(資料庫的操作)、View視圖(圖形介面的設計)、Controller控制器(觸發Model以及View的事件)分離實作 的一種架構**，MVC的目的是為了實現動態的程式設計，讓與資料操作相關和視覺頁面拆分開寫就是MVC架構。

```bash=
# MVC架構範例
# 模拟 Model, View, Controller
var M = {}, V = {}, C = {};

# Model 负责存放资料
M.data = "hello world";

# View 负责将资料输出给用户
V.render = (M) => { alert(M.data); }

# Controller 作为连接 M 和 V 的桥梁
C.handleOnload = () => { V.render(M); }

# 在网页读取的时候呼叫 Controller
window.onload = C.handleOnload;
```
- AJAX(Asynchronous JavaScript and XML) 是一種實現 **網頁不用重新整理，就能即時地透過瀏覽器去跟伺服器溝通、撈出資料的技術方法**，利用 Ajax 跟後端同步資料，並且在前端用 JavaScript 更改畫面，所以你無論做什麼操作都不會換頁，也可以保證前後端的資料是同步的。

- SPA(Single Page Application) 單頁式應用：後端輸出的都是同一個檔案，前端再根據不同Router動態渲染出不同頁面，例如：React，但因為是動態渲染，造成一開始的程式碼是原始且尚未渲染過的內容，可能造成SEO爬蟲變差。

- MPA(Multiple Page Application) 多頁式應用：sever根據不同路徑輸出不同檔案，例如：PHP。

- SSR(Server side render)：第一次的渲染先由Server side render，先將資料庫資料撈出來並展示，可以避免SEO一開始爬蟲資料是沒有內容的，後續的使用者操作還是由前端javascript去做動態渲染的。

![](https://i.imgur.com/1YXFyj5.png)

- PWA(Progressive Web App)漸進式網站應用程式：類似APP的網站，達到應用程式的體驗，並保留網頁的優勢。

### 2. PHP特色、NodeJS 特色、同步&非同步、阻塞&非阻塞
- [php node.js 比較](https://kknews.cc/code/al3yaan.html)
- php比較年長nodejs比較年輕
- nodejs的誕生是為了==解決效能==

> **PHP** 采用==阻塞==执行的模型，==同步==。 当你执行一个命令，比如从数据库取数据，那么必须等这个指令执行完成后，才会执行下面的内容。會等。

> **Node.js** 采用==非阻塞==执行的模型，==非同步==。通常不会等的。 取而代之的是， 你需要提供一个回调函数，这个函数当指令执行完后会被调用一次。

> **在性能方面，Node.js 顯然贏了這一局。**

- [[OS] I/O Models: 同步、非同步、阻塞、非阻塞
](https://kaka-lin.github.io/2020/07/io_models/)
- 阻塞與非阻塞關注的是同一個執行緒發出請求(呼叫)時在等待結果時的狀態。
- 同步與非同步關注的是執行緒之間的通訊模式。例如:使用者執行緒與Kernel之間的通訊模式。

#### NodeJS 
- 採用Google開發的V8運行代碼，使用事件驅動、非阻塞和非同步輸入輸出模型等技術來提高性能
- 特色:（面試必考題）
    - 單執行緒single thread (一個人)有暗樁其實底層是Multi-thread
    - 非阻塞(不会等)
    - 非同步IO(讀寫)
    - event loop事件循環

### 3. JS的物件導向是原型式 prototype (面試必考的)
- [你懂 JavaScript 嗎？#19 原型（Prototype）](https://cythilya.github.io/2018/10/26/prototype/)
- [你不可不知的原型鏈Prototype ](https://medium.com/%E7%8B%97%E5%A5%B4%E5%B7%A5%E7%A8%8B%E5%B8%AB/%E4%BD%A0%E4%B8%8D%E5%8F%AF%E4%B8%8D%E7%9F%A5%E7%9A%84%E5%8E%9F%E5%9E%8B%E9%8F%88-prototype-b2473b301a11)
- [javascript-prototype-chain 面試必考題](https://azole.medium.com/javascript-prototype-chain-ee5a90f6fa5e)
- 建構式(函式) 是一個特殊的函式，通常用new來建構，名稱會跟 class 的名字 一樣，可以傳入一些參數，做一些初始化。舉例：new Date()
- JS 的物件導向是==原型式 prototype==
- 物件導向==是定義一個 class > 透過 new 做出他的 instance==
- 吐司模子＋配方 ==> class
- 被做出來的吐司 ==> instance 
- 同一個模子做出來的但可以改變裡面的new屬性(口味)每一個都是獨立的

### 4. cookie, localstorage, sessionStorage, token
- [Cookie、LocalStorage、SessionStorage 三種差異](https://jscinin.medium.com/javascript-cookie-localstorage-sessionstorage-%E4%B8%89%E7%A8%AE%E5%B7%AE%E7%95%B0-fe7f38260439)
- **cookie 存在 client端**
- **session 存在 sever端**
- session id 存在 cookie 上
- 根據 cookie 上的 session id 查找session 
- seesion 不等於 sessionStorage
- **localstorage & sessionStorage** 存在於client端的瀏覽器保存，**不參與通信**。
- localstorage & sessionStorage 由於 value 只能存入 String ，無法儲存其他類型的數據，Ex: Array、Object...，**所以可以使用 JSON 的方法來轉換**，好方便存取。
- **cookie** 由瀏覽器生成，存在於client端的瀏覽器，**默認瀏覽器關閉後失效**，每個HTTP 請求都會帶著Cookie 的信息，但跨源預設不帶有cookie。
### [localStorage、sessionStorage 介紹文章](https://ithelp.ithome.com.tw/articles/10203525)

#### 1. localStorage
**localstorage 除非被清除，否則在瀏覽器永久儲存**。
是由html5所提供的一個web storage，擁有5MB的大小，可供程式設計者使用，當然它是無法跨域使用，因為他與cookie一樣是認domain name。
```bash=
# 建立
localStorage.setItem('userName', name);

# 取得
localStorage.getItem('userName');

# 移除
localStorage.removeItem('userName');

# 一次清除
localStorage.clear(); 
```

#### 2. sessionStorage
**sessionStorage 僅在當前畫面中儲存，關閉頁面或瀏覽器中就會清除**。
相似於 localStorage ，不同之處在於 sessionStorage 在瀏覽器關掉後就自動清除。
```bash=
# 建立
sessionStorage.setItem("key", value);

# 取得
sessionStorage.getItem('key');

# 移除
sessionStorage.removeItem("key"); 
```

#### 3. [要來塊餅乾嗎? Cookie & Session](https://ithelp.ithome.com.tw/articles/10203123)

- cookie不見得話就沒辦法計入登入狀態？
- 紀錄登入登出狀態方法：
    - 使用 session
    - 使用 token：產生一個 token => reponse 回給前端，需要自己儲存這個 token --> localstorage, session storage，每一次前端發送需要身份驗正的 request 時，都必須自己帶著這個 token，因為 cookie "預設"是無法跨網域讀取的，如果只存在 client 端，那登出會不好做

- [傻傻分不清之Cookie、Session、Token、JWT](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/712796/)
### 5. 靜態網站、動態網站的流程解釋
- [六日： Client-Server 概覽( POST req/res 範例 , 解析動態 req )](https://ithelp.ithome.com.tw/m/articles/10218580)
- 靜態網站
![](https://i.imgur.com/VcfyE4L.png)
- 動態網站 
![](https://i.imgur.com/pS3xrJi.png)

### 6. same-origin policy 是什麼？
要先用 cors 允許跨源存取、再用 withCredentials 允許他在跨源存取的時候帶著 cookie

### 7. 解釋事件冒泡
- [[第七週] DOM - 事件傳遞機制：捕獲與冒泡、事件代理
](https://yakimhsu.com/project/project_w7_eventListener.html)
- [重新認識 JavaScript: Day 14 事件機制的原理
](https://ithelp.ithome.com.tw/articles/10191970)
- true => 捕獲 ; false => 冒泡
- 中間 btn 會「 先冒泡再捕獲 」是因為冒泡的綁定寫在更前面。
- 阻止事件傳遞 e.stopPropagation()


### 8. 閉包是什麼？
閉包是個捕捉了外部函式變數（或使之繼續存活）的函式，它包含了一個函式，以及函式被建立時所在的環境
- [你懂 JavaScript 嗎？#15 閉包（Closure）
](https://cythilya.github.io/2018/10/22/closure/)

### 9. Hoisting 提升
JavaScript 引擎幫你把變數宣告跟函式宣告都自動「移動」到最上面

- [我知道你懂 hoisting，可是你了解到多深？](https://blog.techbridge.cc/2018/11/10/javascript-hoisting/)
- 變數宣告跟函式宣告都會提升
- 只有**宣告**會提升，**賦值**不會提升
- 如果有傳入參數也要把宣告拆解提升
- **函式宣告也會提升而且優先權比較高**


```bash=
# 只有變數的宣告會提升，賦值不會
console.log(a) // undefined
var a = 5

# 上面的程式碼你可以「想像」成這樣：
var a
console.log(a) // undefined
a = 5
```
```bash=
# 結果a會是一個function
console.log(a); // [Function: a]
var a;
function a() {}

# function 的優先權比較高，可以想像成這樣
function a() {} //提升
var a; //提升
console.log(a); //[Function: a]
```

### 10. [[面試] 前端工程師一定要會的 JS 觀念題-中英對照之上篇](https://medium.com/starbugs/%E9%9D%A2%E8%A9%A6-%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%B8%AB%E4%B8%80%E5%AE%9A%E8%A6%81%E6%9C%83%E7%9A%84-js-%E8%A7%80%E5%BF%B5%E9%A1%8C-%E4%B8%AD%E8%8B%B1%E5%B0%8D%E7%85%A7%E4%B9%8B%E4%B8%8A%E7%AF%87-3b0a3feda14f)

### 11. 解釋eventloop
![](https://i.imgur.com/CDkxhLn.png)
延遲會跑到webapis並執行cb=>執行環境瀏覽器nodejs
執行完丟到task queue
當stack是空的event loop工人會把task queue裡的工作搬到stack
io存取硬碟網路連線讀寫檔案資料庫連線丟給webapis去做
非同步不知道誰先回來

