JavaScript 语法速查表 - JavaScript 常用方法与技巧大全

这套速查给写 React/Vue、Node 脚本或任何前端项目的开发者,聚焦每天都要用的 ES6+ 语法:变量与函数、解构、模板字符串、数组高阶方法、异步与模块。与把 API 照名罗列的文档不同,这里按"这句代码解决什么问题"组织,可边看边抄。读完你应能写出不靠 var 的块级变量、用解构抽取值、用 map/filter 取代手写 for,并用 async/await 把回调整理清楚。

编程语言·共 43 条命令·最后更新 2026-07-21

变量与函数 Variables & Functions 6

const name = "value"
用 const 声明块级作用域的常量绑定,一旦初始化不可重新赋值;注意数组/对象的内容(成员)仍可改,只是不能换掉引用本身
let count = 0
声明块级作用域变量,可在同作用域内重新赋值,作用域仅限最近的大括号块
const fn = (x) => x * 2
箭头函数,单行表达式体省略 return,且不绑定自己的 this
const fn = (x, y = 1) => {}
默认参数:未传该实参或显式传 undefined 时才用默认值 y = 1
const fn = (...args) => {}
剩余参数,把调用时多出的实参收集为一个真数组,同解构 ...rest 配合取"其余"部分
function* generator() { yield 1; }
生成器函数:调用不立即执行,需用 next() 逐步推进到每个 yield 点,按需惰性产出值

解构赋值 Destructuring 5

const [a, b] = [1, 2]
数组解构:按位置把可迭代对象的前几个成员解包给变量,常与 ...rest 搭配取首项加剩余项
const { name, age } = person
对象解构:按属性名把成员的引用解包给同名变量,省去反复 person.name 的写法
const { name: userName } = person
解构时重命名:把 person.name 的值绑到新变量 userName
const [first, ...rest] = arr
剩余元素:first 取首项,rest 收集其余所有项成新数组
function fn({ name, age = 18 }) {}
函数参数解构:直接在形参位置解构对象,并在内部以 name/age 使用,age 缺省为 18

字符串与模板 String & Template 6

`Hello ${name}`
模板字符串,支持插值
str.includes("text")
检查是否包含子串
str.startsWith("prefix")
检查是否以某前缀开头
str.endsWith("suffix")
检查是否以某后缀结尾
str.padStart(10, "0")
在开头填充到指定长度
str.trim() / trimStart() / trimEnd()
去除空白

数组方法 Array Methods 8

arr.map(x => x * 2)
映射每个元素,返回新数组
arr.filter(x => x > 0)
过滤元素,返回新数组
arr.reduce((acc, x) => acc + x, 0)
归约为单个值
arr.find(x => x.id === 1)
找到第一个匹配的元素
arr.findIndex(x => x > 0)
找到第一个匹配的索引
arr.some(x => x > 0) / every(x => x > 0)
是否有/全部满足条件
arr.flat() / flatMap()
扁平化数组
Array.from(iterable) / Array.of(1,2,3)
创建数组

异步编程 Async/Await 6

const p = new Promise((resolve, reject) => {})
创建 Promise
p.then(res => {}).catch(err => {})
链式调用
async function fn() { await p; }
async/await 语法
Promise.all([p1, p2])
并行执行,全部成功才成功
Promise.race([p1, p2])
返回最先完成的
Promise.allSettled([p1, p2])
等待全部完成,不论成功失败

模块 Modules 6

import { name } from "./module.js"
命名导入
import * as utils from "./utils.js"
导入所有为命名空间
import defaultExport from "./module.js"
默认导入
export const name = "value"
命名导出
export default function() {}
默认导出
export { name, age }
导出多个

对象与类 Object & Class 6

const obj = { name, age }
属性简写
const obj = { fn() {} }
方法简写
const obj = { [`key${i}`]: value }
计算属性名
Object.keys(obj) / values(obj) / entries(obj)
获取键/值/键值对
class MyClass { constructor() {} }
类定义
class Child extends Parent {}
类继承

典型使用场景

写 React/Vue 组件时用解构从 props/state 抽取值、用模板字符串拼渲染文本;在 Node 或 SSR 里用 async/await 串起文件读写与第三方接口请求;做前端数据处理时用 map/filter/reduce 一行把数组转成视图所需的结构。无论改一个弹窗、写一段接口聚合,还是排查异步竞态,入口最深、被用得最多的就是数组高阶方法与异步那一组。

命令示例

用 map 一次性转换数组

[1, 2, 3].map((x) => x * 2)

map 返回一个长度相同的新数组,不改动原数组,适合派生视图数据。

输出

[2, 4, 6]

用解构给字段赋默认值

const user = { name: "alice" } const { name, age = 18 } = user console.log(name, age)

解构默认值只在属性值严格等于 undefined 时才生效,null 或空字符串不会被替换。

输出

alice 18

async/await 串行读取再处理

async function load() { const res = await fetch("/api/user") const data = await res.json() return data }

await 会把后续逻辑暂挂到 Promise 落定后再继续,外层要用 try/catch 拦下 reject 的错误。

Promise.all 并行等待

const [a, b] = await Promise.all([p1, p2])

Promise.all 有一个 reject 就整体 reject;想互不拖累地拿到各自结果用 Promise.allSettled。

常见坑与注意事项

  • 箭头函数不绑定自己的 this,若在对象方法或事件回调里需要动态 this 就用 function;否则 this 会泄露到外层作用域。
  • const 只禁止重新绑定变量本身,数组 push、对象属性赋值都照常可行,别误以为整个值被冻结不变量。
  • 避免使用 var:它有函数作用域与变量提升,容易踩到声明顺序和闭包捕获的坑,一律用 const/let。
  • 用 == 会做隐式类型转换(0 == false 相等),判断相等一律用 ===;断言 async 抛错要放在 try/catch 里,别让 reject 变成 unhandledrejection。

提示

  • 优先使用 const,只有需要重新赋值时才用 let,避免使用 var。
  • 箭头函数没有自己的 this,会捕获上下文的 this,不适合做对象方法。
  • async/await 是 Promise 的语法糖,让异步代码看起来像同步,更易读。

常见问题

javascript 的 == 与 === 到底有什么区别?

== 会先做类型转换再比较,比如 '1' == 1 成立、null == undefined 成立,容易产生难以察觉的 bug;=== 要求类型和值都相等,不做隐式转换。业务代码里应一律用 ===,判断空值用 x === null 或 typeof 判断。

var、let、const 该什么时候用?

var 有函数作用域、可重复声明且有变量提升,易致意外;let 和 const 都是块级作用域。默认用 const 声明不重新赋值的变量,确实要改变量值再用 let,尽量不用 var。注意 const 只是禁止重新赋值,对象的属性仍可修改。

javascript 数组的 map 和 forEach 有什么区别?

关键区别是返回值:map 返回一个新数组(结果由每个元素执行回调后的返回值组成),适合做变换;forEach 只执行回调、返回 undefined,适合做打印、计数、修改外部状态这类副作用。需要产出新数组时用 map,仅想遍历时用 forEach。

javascript 里怎么安全地深拷贝一个对象?

浅拷贝(展开运算符 {...obj}、Object.assign)只复制顶层,嵌套对象仍是引用,改动会相互影响。JSON.parse(JSON.stringify(obj)) 能做深拷贝但会丢弃函数、undefined、Date、正则并支持不了循环引用;要保留这些或含循环结构时用 structuredClone(obj)。

async/await 里的错误该怎么捕获?

await 会把 Promise 的 rejection 当作同步异常抛出,因此用 try/catch 包住 await 即可捕获;在顶层(如模块作用域)可加 .catch()。注意一个 await 失败不会自动跳过后续语句,需要决定是让整个函数失败还是捕获后继续执行。

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。

由 巧匠 维护

公开更新于 2026年7月21日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们