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