# 如何通過餓了么 Node.js 面試
Hi, 歡迎來到 ElemeFE, 如標題所示本教程的目的是教你如何通過餓了么大前端的面試, 職位是 2~3 年經驗的 Node.js 服務端程序員 (并不是全棧), 如果你對這個職位感興趣或者學習 Node.js 一些進階的內容, 那么歡迎圍觀.
需要注意的是, 本文針對的并不是零基礎的同學, 你需要有一定的 JavaScript/Node.js 基礎, 并且有一定的工作經驗. 另外本教程的重點更準確的說是服務端基礎中 Node.js 程序員需要了解的部分.
如果你覺得大多不了解, 就不用投簡歷了 <del>(這樣兩邊都節約了時間)</del>, 如果你覺得大都有了解或者**光看大綱都都覺得很簡單那么歡迎投遞簡歷至 ElemeFe (fe.job@ele.me)**.
## 導讀
雖然說目的是要通過面試, 但是本教程并不是簡單的把所有面試題列出來, 而**主要是將面試中需要確認你是否懂的點列舉出來**, 并進行一定程度的討論.
本文將一些常見的問題劃分歸類, 每類標明涵蓋的一些`覆蓋點`, 并且列舉幾個`常見問題`, 通常這些問題都是 2~3 年工作經驗需要了解或者面對的. 如果你對某類問題感興趣, 或者想知道其中列舉問題的答案, 可以通過該類下方的 `閱讀更多` 查看更多的內容.
整體上大綱列舉的并不是很全面, 細節上覆蓋率不高, 很多討論只是點到即止, 希望大家帶著問題去思考.
## Js 基礎問題
> 與前端 Js 不同, 后端是直面服務器的, 更加偏向內存方面.
* `[Basic]` 類型判斷
* `[Basic]` 作用域
* `[Basic]` 引用傳遞
* `[Basic]` 內存釋放
* `[Basic]` ES6 新特性
### 常見問題
* js 中什么類型是引用傳遞, 什么類型是值傳遞? 如何將值類型的變量以引用的方式傳遞? [[more]](sections/js-basic.md#q-value)
* js 中, 0.1 + 0.2 === 0.3 是否為 true ? 在不知道浮點數位數時應該怎樣判斷兩個浮點數之和與第三數是否相等?
* const 定義的 Array 中間元素能否被修改? 如果可以, 那 const 修飾對象的意義是? [[more]](sections/js-basic.md#q-const)
* JavaScript 中不同類型以及不同環境下變量的內存都是何時釋放? [[more]](sections/js-basic.md#q-mem)
## 模塊
* `[Basic]` 模塊機制
* `[Basic]` 熱更新
* `[Basic]` 上下文
* `[Basic]` 包管理
### 常見問題
* a.js 和 b.js 兩個文件互相 require 是否會死循環? 雙方是否能導出變量? 如何從設計上避免這種問題? [[more]](sections/module.md#q-loop)
* 如果 a.js require 了 b.js, 那么在 b 中定義全局變量 `t = 111` 能否在 a 中直接打印出來? [[more]](sections/module.md#q-global)
* 如何在不重啟 node 進程的情況下熱更新一個 js/json 文件? 這個問題本身是否有問題? [[more]](sections/module.md#q-hot)
## 事件/異步
* `[Basic]` Promise
* `[Doc]` Events (事件)
* `[Doc]` Timers (定時器)
* `[Point]` 阻塞/異步
* `[Point]` 并行/并發
### 常見問題
* Promise 中 .then 的第二參數與 .catch 有什么區別? [[more]](sections/event-async.md#q-1)
* Eventemitter 的 emit 是同步還是異步? [[more]](sections/event-async.md#q-2)
* 如何判斷接口是否異步? 是否只要有回調函數就是異步? [[more]](sections/event-async.md#q-3)
* nextTick, setTimeout 以及 setImmediate 三者有什么區別? [[more]](sections/event-async.md#q-4)
* 如何實現一個 sleep 函數? [[more]](sections/event-async.md#q-5)
* 如何實現一個異步的 reduce? (注:不是異步完了之后同步 reduce) [[more]](sections/event-async.md#q-6)
## 進程
* [`[Doc]` Process (進程)](sections/process.md#process)
* [`[Doc]` Child Processes (子進程)](sections/process.md#child-process)
* [`[Doc]` Cluster (集群)](sections/process.md#cluster)
* [`[Basic]` 進程間通信](sections/process.md#進程間通信)
* [`[Basic]` 守護進程](sections/process.md#守護進程)
### 常見問題
* 進程的當前工作目錄是什么? 有什么作用? [[more]](sections/process.md#q-cwd)
* child_process.fork 與 POSIX 的 fork 有什么區別? [[more]](sections/process.md#q-fork)
* 父進程或子進程的死亡是否會影響對方? 什么是孤兒進程? [[more]](sections/process.md#q-child)
* cluster 是如何保證負載均衡的? [[more]](sections/process.md#how-it-works)
* 什么是守護進程? 如何實現守護進程? [[more]](sections/process.md#守護進程)
## IO
* [`[Doc]` Buffer](sections/io.md#buffer)
* [`[Doc]` String Decoder (字符串解碼)](sections/io.md#string-decoder)
* [`[Doc]` Stream (流)](sections/io.md#stream)
* [`[Doc]` Console (控制臺)](sections/io.md#console)
* [`[Doc]` File System (文件系統)](sections/io.md#file)
* [`[Doc]` Readline](sections/io.md#readline)
* [`[Doc]` REPL](sections/io.md#repl)
### 常見問題
* Buffer 一般用于處理什么數據? 其長度能否動態變化? [[more]](sections/io.md#buffer)
* Stream 的 highWaterMark 與 drain 事件是什么? 二者之間的關系是? [[more]](sections/io.md#緩沖區)
* Stream 的 pipe 的作用是? 在 pipe 的過程中數據是引用傳遞還是拷貝傳遞? [[more]](sections/io.md#pipe)
* 什么是文件描述符? 輸入流/輸出流/錯誤流是什么? [[more]](sections/io.md#file)
* console.log 是同步還是異步? 如何實現一個 console.log? [[more]](sections/io.md#console)
* 如何同步的獲取用戶的輸入? [[more]](sections/io.md#如何同步的獲取用戶的輸入)
* Readline 是如何實現的? (有思路即可) [[more]](sections/io.md#readline)
## Network
* [`[Doc]` Net (網絡)](sections/network.md#net)
* [`[Doc]` UDP/Datagram](sections/network.md#udp)
* [`[Doc]` HTTP](sections/network.md#http)
* [`[Doc]` DNS (域名服務器)](sections/network.md#dns)
* [`[Doc]` ZLIB (壓縮)](sections/network.md#zlib)
* [`[Point]` RPC](sections/network.md#rpc)
### 常見問題
* cookie 與 session 的區別? 服務端如何清除 cookie? [[more]](sections/network.md#q-cookie-session)
* HTTP 協議中的 POST 和 PUT 有什么區別? [[more]](sections/network.md#q-post-put)
* 什么是跨域請求? 如何允許跨域? [[more]](sections/network.md#q-cors)
* TCP/UDP 的區別? TCP 粘包是怎么回事,如何處理? UDP 有粘包嗎? [[more]](sections/network.md#q-tcp-udp)
* `TIME_WAIT` 是什么情況? 出現過多的 `TIME_WAIT` 可能是什么原因? [[more]](sections/network.md#q-time-wait)
* ECONNRESET 是什么錯誤? 如何復現這個錯誤?
* socket hang up 是什么意思? 可能在什么情況下出現? [[more]](sections/network.md#socket-hang-up)
* hosts 文件是什么? 什么叫 DNS 本地解析?
* 列舉幾個提高網絡傳輸速度的辦法?
## OS
* [`[Doc]` TTY](sections/os.md#tty)
* [`[Doc]` OS (操作系統)](sections/os.md#os-1)
* [`[Doc]` Path](sections/os.md#path)
* [`[Doc]` 命令行參數](sections/os.md#命令行參數)
* [`[Basic]` 負載](sections/os.md#負載)
* [`[Point]` CheckList](sections/os.md#checklist)
### 常見問題
* 什么是 TTY? 如何判斷是否處于 TTY 環境? [[more]](sections/os.md#tty)
* 不同操作系統的換行符 (EOL) 有什么區別? [[more]](sections/os.md#os)
* 服務器負載是什么概念? 如何查看負載? [[more]](sections/os.md#負載)
* ulimit 是用來干什么的? [[more]](sections/os.md#ulimit)
## 錯誤處理/調試/優化
* [`[Doc]` Errors (異常)](sections/error.md#errors)
* [`[Doc]` Domain (域)](sections/error.md#domain)
* [`[Doc]` Debugger (調試器)](sections/error.md#debugger)
* [`[Doc]` C/C++ 插件](sections/error.md#c-c++-addon)
* [`[Doc]` V8](sections/error.md#v8)
* [`[Point]` 內存快照](sections/error.md#內存快照)
* [`[Point]` CPU profiling](sections/error.md#cpu-profiling)
### 常見問題
* 怎么處理未預料的出錯? 用 try/catch ,domains 還是其它什么? [[more]](sections/error.md#q-handle-error)
* 什么是 `uncaughtException` 事件? 一般在什么情況下使用該事件? [[more]](sections/error.md#uncaughtexception)
* domain 的原理是? 為什么要棄用 domain? [[more]](sections/error.md#domain)
* 什么是防御性編程? 與其相對的 let it crash 又是什么?
* 為什么要在 cb 的第一參數傳 error? 為什么有的 cb 第一個參數不是 error, 例如 http.createServer?
* 為什么有些異常沒法根據報錯信息定位到代碼調用? 如何準確的定位一個異常? [[more]](sections/error.md#錯誤棧丟失)
* 內存泄漏通常由哪些原因導致? 如何分析以及定位內存泄漏? [[more]](sections/error.md#內存快照)
## 測試
* [`[Basic]` 測試方法](sections/test.md#測試方法)
* [`[Basic]` 單元測試](sections/test.md#單元測試)
* [`[Basic]` 集成測試](sections/test.md#集成測試)
* [`[Basic]` 基準測試](sections/test.md#基準測試)
* [`[Basic]` 壓力測試](sections/test.md#壓力測試)
* [`[Doc]` Assert (斷言)](sections/test.md#assert)
### 常見問題
* 為什么要寫測試? 寫測試是否會拖累開發進度?[[more]](sections/test.md#q-why-write-test)
* 單元測試的單元是指什么? 什么是覆蓋率?[[more]](sections/test.md#單元測試)
* 測試是如何保證業務邏輯中不會出現死循環的?[[more]](sections/test.md#q-death-loop)
* mock 是什么? 一般在什么情況下 mock?[[more]](sections/test.md#mock)
## util
* [`[Doc]` URL](sections/util.md#url)
* [`[Doc]` Query Strings (查詢字符串)](sections/util.md#query-strings)
* [`[Doc]` Utilities (實用函數)](sections/util.md#util-1)
* [`[Basic]` 正則表達式](sections/util.md#正則表達式)
### 常見問題
* HTTP 如何通過 GET 方法 (URL) 傳遞 let arr = [1,2,3,4] 給服務器? [[more]](sections/util.md#get-param)
* Node.js 中繼承 (util.inherits) 的實現? [[more]](sections/util.md#utilinherits)
* 如何遞歸獲取某個文件夾下所有的文件名? [[more]](sections/util.md#q-traversal)
## 存儲
* [`[Point]` Mysql](sections/storage.md#mysql)
* [`[Point]` Mongodb](sections/storage.md#mongodb)
* [`[Point]` Replication](sections/storage.md#replication)
* [`[Point]` 數據一致性](sections/storage.md#數據一致性)
* [`[Point]` 緩存](sections/storage.md#緩存)
### 常見問題
* 備份數據庫與 M/S, M/M 等部署方式的區別? [[more]](sections/storage.md#replication)
* 索引有什么用,大致原理是什么? 設計索引有什么注意點? [[more]](sections/storage.md#索引)
* Monogdb 連接問題(超時/斷開等)有可能是什么問題導致的? [[more]](sections/storage.md#Mongodb)
* 什么情況下數據會出現臟數據? 如何避免? [[more]](sections/storage.md#數據一致性)
* redis 與 memcached 的區別? [[more]](sections/storage.md#緩存)
## 安全
* [`[Doc]` Crypto (加密)](sections/security.md#crypto)
* [`[Doc]` TLS/SSL](sections/security.md#tls-ssl)
* [`[Doc]` HTTPS](sections/security.md#https)
* [`[Point]` XSS](sections/security.md#xss)
* [`[Point]` CSRF](sections/security.md#csrf)
* [`[Point]` 中間人攻擊](sections/security.md#中間人攻擊)
* [`[Point]` Sql/Nosql 注入](sections/security.md#SQL-NoSQL-注入)
### 常見問題
* 加密是如何保證用戶密碼的安全性? [[more]](sections/security.md#crypto)
* TLS 與 SSL 有什么區別? [[more]](sections/security.md#tls-ssl)
* HTTPS 能否被劫持? [[more]](sections/security.md#https)
* XSS 攻擊是什么? 有什么危害? [[more]](sections/security.md#xss)
* 過濾 Html 標簽能否防止 XSS? 請列舉不能的情況? [[more]](sections/security.md#xss)
* CSRF 是什么? 如何防范? [[more]](sections/security.md#csrf)
* 如何避免中間人攻擊? [[more]](sections/security.md#中間人攻擊)