JavaScript 速查 — 簡明參考
現代 JavaScript (ES2022) 語法、標準庫與最常用 DOM / Node 幫助函數的速查手冊,覆蓋約 80% 日常場景。
JavaScript ES2022
ECMAScript · 多範式 · 動態 · 弱類型
學習路徑
先跑通「Hello World 與運行環境」(Node.js 或瀏覽器控制台)→ 熟悉變量、類型與流程控制 → 掌握數組與對象的高階方法 → 理解引用與拷貝、函數與閉包 → 重點學習異步(Promise/async/await)→ 最後按需查 DOM、網絡 fetch、Node 模塊與構建調試。FAQ 節適合回頭避坑。
1.Hello World 與運行環境
用 Node.js 或瀏覽器運行 JavaScript,理解腳本、模塊與 npm 項目結構。
console 輸出
console.log 輸出到控制台。console.error 錯誤輸出、console.table 表格展示。瀏覽器與 Node 通用。
Node 運行
node 直接運行 .js 文件。node -e 執行單行表達式、node -p 打印結果。無瀏覽器依賴時首選。
瀏覽器 script
HTML 用 <script> 加載 JS。defer 延遲執行(DOM 就緒後)、async 異步加載。module 類型啓用 ESM。
命令行參數
Node 中 process.argv 含完整命令行:argv[0] 是 node、argv[1] 是腳本路徑、argv[2] 起為參數。
npm 初始化
npm init 創建 package.json 項目。npm install 安裝依賴並生成 node_modules 與 lock 文件。
package.json
package.json 描述項目:name/version、main 入口、scripts 命令、dependencies 依賴。
ES Modules
import/export 模塊化:export 導出、import 導入。package.json 設 type: module 或用 .mjs 擴展名。
嚴格模式
use strict 開啓嚴格模式:禁止隱式全局變量、靜默錯誤變異常。ESM 模塊自動嚴格模式。
2.變量與常量
let/const 聲明、作用域、動態類型、解構與模板字符串。
let 與 const
let 聲明可變變量、const 聲明常量(對象本身可變)。塊級作用域。優先 const,需要改再 let。
var 與 let 區別
var 函數級作用域 + 提升,let/const 塊級作用域。現代代碼一律 let/const,避免 var 的坑。
作用域
塊級作用域 {}、函數作用域、全局作用域。內層可讀外層變量,外層讀不到內層。
動態類型
JS 變量無類型約束:同一變量可賦任意類型值。typeof 運行時檢查當前類型。
解構賦值
從數組/對象提取值到變量。對象解構按名、數組按序。可設置默認值、嵌套解構。
命名規範
變量/函數用 lowerCamelCase、常量 UPPER_SNAKE_CASE、類/組件 UpperCamelCase。布爾變量 is/has 前綴。
提升
var 聲明與函數聲明提升到作用域頂部。let/const 有暫存死區(TDZ),聲明前訪問報錯。
模板字符串
反引號字符串支持 ${} 插值與多行。拼字符串、多行文本首選,避免 + 拼接。
3.數據類型
原始類型、對象、typeof 判斷與類型轉換。
原始類型
7 種原始類型:string、number、boolean、null、undefined、symbol、bigint。其餘都是 object。
數字與 NaN
number 覆蓋整數與浮點。NaN 表示非數字、Infinity 無窮。NaN 與任何值(含自身)都不相等。
字符串
字符串不可變。長度 length、索引 [i]、方法 toUpperCase/slice/split。字符編碼 UTF-16。
真值與假值
假值:false、0、''、null、undefined、NaN。其餘都是真值。if 判斷走真值轉換。
null 與 undefined
undefined 表示未定義/未賦值;null 表示顯式的空值。訪問不存在的屬性返回 undefined。
Symbol 與 BigInt
Symbol 唯一標識(對象私有鍵);BigInt 任意精度大整數,末尾加 n。typeof 各自識別。
typeof 判斷
typeof 判斷原始類型;數組/日期/null 都返回 'object',需其他方法區分。
類型轉換
顯式轉換:String()/Number()/Boolean()。隱式轉換常出坑:+ 拼接、- 運算。
對象類型
除原始類型外都是對象:普通對象、數組、函數、Date、Map 等。對象是引用類型。
4.引用與拷貝
值 vs 引用、淺拷貝深拷貝、數組與對象引用、GC。
值 vs 引用
原始類型按值傳遞(拷貝);對象/數組/函數按引用傳遞(共享)。這是 JS 最重要的模型。
對象引用
函數傳參:對象參數共享同一對象,函數內修改成員影響外部。基本類型不受影響。
淺拷貝
展開運算符 {...obj} / [...arr] 或 Object.assign 做一層拷貝。嵌套對象仍共享引用。
深拷貝
深拷貝遞歸複製所有層級。structuredClone(現代)或遞歸手寫。含函數/循環引用需特殊處理。
數組拷貝
[...arr] 淺拷貝、slice() 拷貝、Array.from 轉換。嵌套數組(多維)仍是淺拷貝。
JSON 序列化拷貝
JSON.stringify/parse 是深拷貝的簡單法,但丟失 undefined/函數/Symbol,且不支持循環引用。
垃圾回收
V8 自動回收無引用對象。局部變量函數結束即釋放。全局/閉包持有會延長生命週期。
對象相等比較
=== 對對象比較的是引用而非內容,兩個內容相同的對象也不相等。按字段比較需手動深比較。
5.流程控制
if/else、循環、switch、三元與邏輯短路。
if / else
if/else 按條件分支,條件走真值轉換。else-if 鏈多分支。
三元運算符
cond ? a : b 一行條件賦值。嵌套三元可讀性差,複雜邏輯用 if/switch。
for 循環
經典 for 用下標。多數集合場景用 for...of 或數組方法更簡潔。
for...of
for...of 遍歷可迭代對象(數組、字符串、Map/Set、NodeList)。無需下標。
for...in 對象
for...in 遍歷對象可枚舉鍵(含繼承)。數組用 for...of,遍歷對象鍵用 Object.keys。
while / do-while
while 先判斷後執行;do-while 至少執行一次。循環次數未知的場景用。
switch
switch 用嚴格相等 === 比較。case 匹配後執行到 break。注意 fall-through(漏 break)。
邏輯短路與可選鏈
&& || ?? 短路求值。?. 可選鏈安全訪問、?? 空值合併(null/undefined 才兜底)。
break 與 continue
continue 跳本輪、break 退出循環、帶標籤 break/continue 控制嵌套循環。
6.函數與閉包
函數聲明、箭頭函數、參數、閉包、this 與回調。
函數聲明與表達式
函數聲明會提升、函數表達式不提升。箭頭函數是表達式更簡潔。三者語法不同。
箭頭函數
箭頭函數:簡寫、無自己的 this/arguments、不能作構造函數。單表達式隱式返回。
參數與默認值
函數參數可設默認值、rest 收集剩餘參數。arguments 是類數組(箭頭函數無)。
閉包
閉包讓函數記住創建時的作用域:內層函數可訪問外層變量,即使外層已返回。
this 綁定
this 在調用時決定:對象方法指向對象、普通函數非嚴格模式指向全局、箭頭函數繼承外層。
call / apply / bind
call/apply 立即調用並指定 this,bind 返回綁定 this 的新函數。apply 傳數組參數。
回調函數
回調是把函數作為參數傳給異步操作。現代優先用 Promise/async。回調多層嵌套即回調地獄。
IIFE 立即執行
IIFE (function(){})() 立即執行並隔離作用域。現代用塊級作用域 {} 或模塊替代。
遞歸
函數調用自身需基線條件否則棧溢出。尾遞歸優化在多數 JS 引擎未完全支持。
7.字符串處理
字符串方法、模板字符串、正則匹配、拆分與字符處理。
常用方法
常用方法:length 長度、slice/substring 截取、indexOf 查找、includes 包含、replace 替換、split 拆分與 trim 去空白。
大小寫與編碼
toUpperCase/toLowerCase 轉換大小寫。charCodeAt 取碼點、fromCharCode 反向。localeCompare 比較。
Unicode 處理
字符串是 UTF-16 碼元序列,Emoji 等增補平面字符佔 2 個碼元。遍歷用 for...of 或 Array.from。
模板字符串拼接
模板字符串 ${} 插值與多行最推薦。可嵌套表達式、方法調用。
正則基礎
正則字面量 /pattern/ 或 new RegExp。test 判斷、exec 匹配。g 全局、i 忽略大小寫。
正則替換
replace 用正則替換,$1 引用組。替換回調處理複雜邏輯。replaceAll 替換全部字面量。
拆分與連接
split 按分隔符拆數組、join 合併回字符串。split('') 拆字符。注意空字符串拆分行為。
數字轉字符串
toString/模板轉字符串、toFixed 小數位數、toLocaleString 千分位、padStart 補零。
8.數組與對象
數組高階方法、Map/Set、對象操作與解構。
數組高階方法
map 映射、filter 過濾、reduce 歸約、find 查找、some/every 判斷。不修改原數組。
Map
Map 任意鍵映射:get/set/has/delete/size。鍵可以是對象。迭代保插入順序。
Set
Set 去重集合:add/has/delete/size。數組去重與成員判斷首選。
對象操作
Object.keys/values/entries 遍歷。Object.assign 合併。Object.freeze 凍結。in 判斷屬性。
reduce 歸約
reduce 把數組規約為單個值:累加、分組、扁平化。初始值參數可選但建議提供。
排序
sort 默認按字符串排序(坑)。數字排序需比較函數。sort 原地修改數組。
展開與合併
展開運算符 ... 合併數組/對象、複製、展開參數。Rest 收集與 Spread 展開是鏡像。
方法鏈式調用
map/filter 等返回新數組可鏈式。大量操作時注意中間數組分配。
數組空洞與稀疏
數組空洞(hole)與 undefined 不同。map 跳過空洞。密集數組用 Array.from 或 fill。
9.內存與性能
閉包與內存泄漏、WeakMap/WeakSet、大數據處理與優化。
閉包內存
閉包持有外部變量引用,即使變量不再需要。長期存活引用會阻止 GC。
事件監聽器泄漏
DOM 元素被移除但監聽器仍引用,或監聽器持外部對象導致泄漏。移除元素前解綁或節流。
WeakMap / WeakSet
WeakMap 鍵為弱引用:對象無其他引用即被回收。適合關聯數據、緩存、私有字段。
性能優化
避免不必要拷貝與重複計算。局部變量緩存 length、合併 DOM 操作、防抖節流高頻事件。
棧溢出
無限遞歸或深遞歸導致 RangeError: Maximum call stack。改循環或限制深度。
大數據處理
大數組 reduce/map 全量分配耗內存。分批處理、生成器惰性、TypedArray 二進制優化。
GC 與全局對象
全局變量/緩存永不釋放。避免無界緩存,及時清理。現代 V8 標記清除自動處理。
記憶化緩存
用 Map 緩存純函數的計算結果,相同入參直接返回緩存,避免重複昂貴計算。注意緩存佔用。
10.面向對象
class 語法、繼承、封裝、靜態成員與原型鏈。
class 定義
class 定義對象模板:constructor 構造、方法、屬性。new 創建實例。
繼承 extends
extends 繼承,super() 調用父類構造、super.method() 調父類方法。
getter / setter
get/set 定義訪問器屬性:讀寫時執行邏輯、加校驗。訪問如同屬性非方法。
靜態成員
static 成員屬於類而非實例:靜態方法工具函數、靜態屬性常量。static {} 靜態塊初始化。
私有字段
# 前綴定義私有字段/方法:類外訪問報錯。真實封裝(非約定下劃線)。
instanceof 判斷
instanceof 判斷對象是否屬於某類或其父類鏈。Object.getPrototypeOf 查看原型。
原型鏈
對象通過原型鏈共享方法。class 是原型繼承的語法糖。修改 prototype 影響所有實例。
組合優於繼承
深度繼承鏈難維護。用對象組合:構造時傳入依賴、mixin 混合功能。
11.異常處理
try/catch/finally、錯誤類型、拋出、異步錯誤處理。
try / catch / finally
try 放可能出錯的代碼,catch 捕獲,finally 無論成敗都執行。異常沿調用棧傳播。
錯誤類型
Error 基類及其子類:TypeError、ReferenceError、RangeError、SyntaxError。instanceof 區分。
拋出錯誤
throw new Error('msg') 拋異常。可拋任意值但慣例拋 Error 對象(有堆棧)。
自定義錯誤
extends Error 定義業務錯誤。設置 name 屬性便於識別,保留 message 與堆棧。
異步錯誤
Promise/async 的錯誤走 .catch 或 try/catch(await 內)。同步 try/catch 捕不到異步拋錯。
未處理錯誤
Promise 無 catch 導致 unhandledrejection。頂層全局監聽 uncaughtException/unhandledrejection。
錯誤隔離
批量處理時單個失敗不應中斷整體。逐項 try/catch 或 catch 後記錄繼續。
錯誤原因 cause
ES2022 新增 Error cause 選項,包裝錯誤時保留底層原因與堆棧,便於逐層排查。
12.文件與 IO
Node 文件系統、控制台輸入、JSON 讀寫與瀏覽器 DOM IO。
fs 讀取文件
Node fs/promises 讀取文件:readFile 全讀、readFileSync 同步版。現代優先 Promise 版。
fs 寫入與追加
writeFile 覆蓋寫入、appendFile 追加、mkdir 建目錄、exists 判斷。rename/cp/rm 文件操作。
JSON 文件讀寫
讀 JSON 文件 parse、寫對象 stringify。JSON 存配置與數據常用。
標準輸入輸出
process.stdin 讀輸入(流)、readline 逐行交互、process.stdout.write 輸出。
fetch 網絡 IO
fetch 讀取遠程資源。async/await 處理響應,res.json()/res.text() 解析。Node 18+ 內置。
瀏覽器 DOM IO
DOM 讀寫頁面內容:getElementById 查找、textContent 文本、innerHTML 標記。僅瀏覽器環境。
流式 IO
大文件用流避免整塊讀入內存。createReadStream/createWriteStream、pipe 或 for await。
path 路徑處理
node:path 處理文件路徑:join 拼接、resolve 轉絕對路徑、extname 擴展名、basename 文件名。
13.常見陷阱(FAQ)
JS 開發者最常踩的坑:== vs ===、this、異步、拷貝與真值。
== 與 ===
== 做隱式轉換(易錯),=== 嚴格相等。一律用 ===。除 null == undefined 場景。
this 丟失
方法賦值/回調中 this 不再指向對象。箭頭函數繼承外層、bind 顯式綁定。
浮點精度
0.1 + 0.2 !== 0.3(二進制表示不精確)。比較用容差,金額用整數分/庫。
異步執行順序
setTimeout/網絡請求是異步,代碼按同步順序寫完不保證按順序執行。用 await/Promise。
淺拷貝深拷貝
展開運算符只拷貝一層,嵌套對象仍共享。改嵌套會影響原對象。
真值判斷
空數組/空對象是真值。判斷數組空要用 .length、對象空用 Object.keys().length。
var 作用域泄漏
var 無塊級作用域,循環/if 裏聲明會泄漏到函數級。循環變量用 let。
parseInt 陷阱
parseInt('08') 老引擎按八進制?parseInt('3px') 返回 3。嚴格解析用 Number 或 +。
嵌套三元
多層三元難以閲讀。複雜分支用 if/else 或對象映射。
對象屬性變化
對象解構是淺拷貝,嵌套屬性仍是引用。防止改原對象需深拷貝。
14.異步與事件循環
事件循環、Promise、async/await、定時器與併發。
事件循環
JS 單線程 + 事件循環。同步代碼先執行,異步回調(定時器/IO)進任務隊列待處理。
Promise
Promise 表示異步結果。then 處理成功、catch 處理失敗、finally 收尾。鏈式避免回調地獄。
async / await
async 函數返回 Promise,await 等待結果並像同步書寫。try/catch 捕獲異步錯誤。
定時器
setTimeout 延遲執行、setInterval 週期執行、clearTimeout/clearInterval 取消。延遲單位毫秒。
Promise 組合
Promise.all 全部成功才成功;allSettled 全部結束後彙報各自狀態;race 先完成者勝。
Web Worker
Worker 在獨立線程跑耗時代碼,不阻塞 UI。postMessage 通信。Node 用 worker_threads。
併發控制
批量異步任務限制併發數,避免資源耗盡。分批或信號量。
微任務與宏任務
微任務(Promise.then、queueMicrotask)優先於宏任務(定時器)。同一輪內微任務先清空。
15.網絡與 HTTP
fetch 請求、HTTP 方法、錯誤處理、JSON、WebSocket 與 URL。
fetch 基礎
fetch 發 HTTP 請求返回 Promise。res.ok 判斷成功、res.json()/text() 讀取。Node 18+ 與瀏覽器內置。
POST 與請求體
fetch 第二個參數配置 method、headers、body。JSON 請求體需 JSON.stringify。
查詢參數
URLSearchParams 構建查詢串。encodeURIComponent 編碼特殊字符。URL 解析。
網絡錯誤處理
fetch 只在網絡層失敗才 reject(斷網),HTTP 4xx/5xx 不拋錯需檢查 res.ok。超時用 AbortController。
WebSocket
WebSocket 全雙工長連接。onopen/onmessage/onclose 事件,send 發送。實時推送場景。
axios 對比
axios 提供攔截器、自動 JSON、錯誤對象更友好。fetch 是原生,axios 是第三方庫。
HTTP 狀態碼
2xx 成功、3xx 重定向、4xx 客户端錯誤、5xx 服務端錯誤。常見 200/201/400/401/404/500。
文件上傳 FormData
FormData 構造 multipart 表單,fetch POST 上傳文件與字段。進度監聽用 XMLHttpRequest 更方便。
16.日期與時間
Date、時間戳、格式化、時區與定時器。
Date 基礎
new Date() 當前時間、getFullYear/getMonth(0 起)/getDate。month 是 0 基索引。
時間戳
Date.now() 毫秒時間戳(UTC epoch)。getTime() 同。跨時區存儲用時間戳或 ISO。
格式化輸出
toLocaleDateString/toLocaleString 本地化格式。Intl.DateTimeFormat 精細控制。
時區
getTime 是 UTC 時間點,本地方法(getHours)按運行時區顯示。存儲用 ISO/時間戳。
時間差
兩個 Date 相減得毫秒差。換算秒/分/時。性能測量用 performance.now 更精確。
日期運算
加天數/月用 setDate/setMonth 或毫秒運算。注意月份 0 基與跨月邊界。
日期解析
new Date(string) 解析日期字符串。ISO 格式最可靠('2024-01-01T12:00:00Z')。其他格式有兼容性差異。
Intl 格式化
Intl.NumberFormat 數字/貨幣、Intl.DateTimeFormat 日期。按區域本地化輸出。
17.Node 進程
process 環境變量、參數、退出碼、當前目錄與進程信息。
環境變量
process.env 讀取環境變量(Node)。process.env.NODE_ENV 常見。跨平台配 .env 文件。
命令行參數
process.argv 原始參數。解析選項可用 commander/yargs 庫,簡單場景手寫。
退出碼
process.exit(code) 退出並返回碼(0 成功、非 0 失敗)。未捕獲異常默認碼 1。
當前目錄與路徑
process.cwd() 當前工作目錄、__dirname 模塊目錄、__filename 模塊文件(CJS)。
進程信號
SIGINT(Ctrl+C)、SIGTERM(kill 默認)信號處理,優雅關閉(存數據、斷連接)。
進程信息
process.pid 進程 ID、process.uptime() 運行秒數、process.memoryUsage() 內存、process.platform 平台。
標準流
process.stdin/stdout/stderr 三大流。管道數據處理、輸出重定向與管道協作。
子進程 child_process
child_process 啓動外部命令:exec 取輸出、spawn 流式交互、fork 運行 JS 腳本。注意 shell 注入。
18.正則表達式
正則字面量、匹配、捕獲組、替換與常用模式。
正則語法
字面量 /pattern/ 與 new RegExp。\d 數字、\w 單詞字符、\s 空白、[] 字符類、{} 量詞。
正則標誌
g 全局、i 忽略大小寫、m 多行(^$ 匹配行)、s dotAll(. 匹配換行)、u unicode。
test 與 match
test 返回布爾、match 返回匹配結果、matchAll 遍歷全部。exec 單次匹配有 lastIndex。
捕獲組
圓括號捕獲,match[1] 取組、命名組 (?<name>...) 用 match.groups.name。非捕獲組 (?:...)。
正則替換
replace 支持 $1/$<name> 組引用、回調函數。replaceAll 替換全部(g 語義)。
常用模式
郵箱、URL、IP、手機號、純數字/字母。生產校驗配合白名單更穩。
正則性能
避免災難性回溯(嵌套量詞)。長輸入用預編譯正則。必要時用字符串方法代替。
前瞻與後顧
斷言只匹配位置不消費字符:前瞻 (?=)、負前瞻 (?!)、後顧 (?<=)。適合密碼與邊界校驗。
19.構建與調試
npm 腳本、打包工具、調試、測試與代碼規範。
npm 腳本
package.json scripts 定義常用命令。npm run 執行。&& 串聯、pre/post 鈎子。
打包工具
Vite(現代推薦)、webpack、Rollup、esbuild 打包 ES 模塊到瀏覽器可運行代碼。
調試
console 分級、debugger 斷點、Node --inspect 調試器。source map 定位源碼。
測試
Vitest/Jest 單元測試:describe 分組、test/it 用例、expect 斷言。npm test 運行。
代碼規範 ESLint
ESLint 檢查語法與風格,Prettier 統一格式化。pre-commit 鈎子自動檢查。
TypeScript 集成
TS 加類型。tsc 編譯、ts-node/tsx 直接運行。Vite 原生支持 .ts。
CI 與部署
CI 自動跑測試與構建。GitHub Actions 等平台 workflow 配置。產物部署到靜態託管/容器。
ESM 與 CJS
兩種模塊系統:ESM 靜態 import 可 tree-shake,CJS 動態 require 運行時加載。type 字段控制默認。
關於本速查
本頁是 ECMAScript 2022(JavaScript)的自包含速查手冊,覆蓋語言核心與瀏覽器/Node 常用 API 在真實項目中約 80% 的常見用法。內容偏向現代慣用法:let/const 塊級作用域、箭頭函數、模板字符串、解構賦值、展開運算符、Promise 與 async/await、可選鏈與空值合併。JavaScript 由 Brendan Eich 於 1995 年在 Netscape 發明,如今是唯一一種所有瀏覽器原生支持的語言,也是 Web 前端、Node.js 服務端與桌面應用的基礎。 19 個章節各自聚焦一個主題:基礎語法、變量與作用域、類型、引用與值語義、控制流、函數與閉包、字符串、數組與對象、內存與垃圾回收、原型與類、錯誤處理、輸入輸出、常見誤區、併發(事件循環)、網絡(fetch)、時間、進程、正則與構建工具。每個小節都配有「概念介紹 + 可直接複製的代碼片段」。 所有代碼與文字均在瀏覽器本地渲染,無任何數據離開你的設備。權威參考見 MDN Web Docs。
版本 2.1.0