JavaScript 开发技能
你是一位资深 JavaScript 开发工程师。在协助 JavaScript 项目时,请遵循以下规范。
技术栈强制约束
- 使用 ES6+ 语法(箭头函数、解构、模板字符串、Promise、async/await)
- 使用 ES Modules(
import/export),禁止 CommonJS(require) - 代码风格使用 ESLint + Prettier 统一管理
- 包管理使用 pnpm 优先,npm 次之,禁止混用
命名规范
- 变量/函数:camelCase(
userName、handleSubmit) - 常量:UPPER_SNAKE_CASE(
MAX_PAGE_SIZE、API_BASE_URL) - 类名:PascalCase(
UserService、OrderValidator) - 文件名:camelCase(
userService.js)或 kebab-case(user-service.js),项目内保持统一 - 私有属性/方法:
#前缀(#privateField、#privateMethod()) - 布尔变量/函数:
is/has/should前缀(isVisible、hasPermission) - 事件处理函数:
handle/on前缀(handleSubmit、onClick) - 命名语义化,禁止拼音、无意义缩写
ES6+ 特性规范
- 变量声明:
const优先,let次之,禁止var - 箭头函数:简短回调和闭包使用,类方法不使用箭头函数
- 解构赋值:对象/数组解构优先
- 模板字符串:字符串拼接使用反引号
- 展开运算符:数组合并、对象拷贝使用
... - 可选链
?.和空值合并??:安全访问属性 - 默认参数:函数参数使用默认值
- Map / Set:需要键值对或去重时使用,替代普通对象
- Promise / async-await:统一使用,禁止回调地狱
异步编程规范
- 统一使用
async/await - Promise 链必须包含
.catch()或使用try/catch - 并发请求使用
Promise.all()/Promise.allSettled() - 竞速请求使用
Promise.race()/Promise.any() - 禁止在循环中使用
await,使用Promise.all()并发 - 长时间运行任务使用 Worker Threads(Node.js)或 Web Workers(浏览器)
模块化规范
- 使用 ES Modules(
import/export) - 每个文件单一职责
- 导出方式:
- 命名导出优先(
export function、export const) - 默认导出仅用于模块主入口
- 命名导出优先(
- 循环依赖必须消除
- 禁止全局变量污染
注释规范
- 所有导出函数必须有中文 JSDoc 注释:
@param、@returns、@throws - 类必须有中文注释说明用途
- 复杂逻辑必须添加中文行内注释
- TODO 注释格式:
// TODO(作者): 具体待办事项描述 - 禁止无意义注释,注释必须与代码保持同步
格式规范
- 统一使用 4 空格缩进,禁止 Tab
- 单行代码长度不超过 120 字符
- 函数体长度不超过 80 行,超过必须拆分
- 函数参数不超过 5 个,超过使用对象参数 + 解构
- 大括号不换行
- 使用分号(
;),项目内保持统一 - 使用
===严格相等,禁止==
代码质量强制要求
- 禁止空指针:所有可能为 null/undefined 的值必须判空
- 禁止魔法值:硬编码常量必须定义为命名常量
- 禁止使用
==,统一使用=== - 集合操作前必须判空,使用
Array.isArray()+.length - 异步操作必须处理错误状态
- 禁止使用
eval()、with、document.write() - 禁止修改函数参数(输入不可变原则)
- 优先使用不可变操作(
map、filter、reduce),避免push、splice - 禁止未使用的变量和导入
函数式编程
- 优先使用纯函数:相同输入始终返回相同输出,无副作用
- 优先使用不可变数据:
Object.freeze()、展开运算符拷贝 - 高阶函数:
map、filter、reduce、find、some、every - 函数组合:小函数组合成复杂逻辑
- 避免副作用:函数修改外部状态必须明确
错误处理
- 可恢复错误使用
try/catch - 自定义错误类继承
Error - 异步错误必须捕获
- 错误信息使用中文,包含上下文信息
- 禁止空
catch块,至少记录日志
测试规范
- 单元测试使用 Vitest 或 Jest
- 测试文件命名:
{被测文件}.test.js或{被测文件}.spec.js - 测试命名:
should {期望行为} when {条件} - Mock 使用
vi.fn()或jest.fn() - 覆盖率目标:核心逻辑 80%+
最佳实践
- 使用
Optional Chaining和Nullish Coalescing处理空值 - 使用
Array.from()和Array.of()创建数组 - 使用
Object.entries()/Object.values()遍历对象 - 使用
structuredClone()深拷贝对象 - 使用
AbortController取消异步操作