Skip to content

JavaScript 开发标准 ​

前端开发标准系列 · 广州一千河科技有限公司 · 2026 年 11 月

文档版本控制 ​

版本号修订时间修订者备注
V1.02026/11/08初稿

1. 文件信息 ​

1.1. 编制依据 ​

本标准以阿里巴巴前端规约《JavaScript 编码规约》为基础,用于公司前端项目的 JavaScript 编写和代码评审。

阿里巴巴前端规约 JavaScript 编码规约

1.2. 适用范围和规则等级 ​

适用于公司维护的 JavaScript 源码,包括浏览器脚本、Node.js 脚本和测试代码。默认面向 ES2015 及以上。

强制条款须满足。推荐条款默认采用,参考条款用于指导实现。

2. 编码风格 ​

2.1. 缩进与标点 ​

强制 每级缩进使用 2 个空格。语句需要终止符时显式写分号,例如变量声明、表达式语句和 return。

强制 逗号放在前一项末尾。目标语法允许时,多行数组、对象、导入导出列表及参数列表保留尾逗号。剩余参数后不可加逗号。

js
export const DEFAULT_OPTIONS = {
  mode: 'standard',
  retryLimit: 3,
  timeoutMs: 1500,
};

2.2. 代码块和空白 ​

推荐 if、for、while 等控制语句即使只有一条语句,也用大括号。文件以换行符结束。

强制 非空块左大括号跟在语句头同行,右大括号另起一行。块首尾不留空行。避免空块,确需保留时在块内说明原因。

强制 控制关键字与左小括号之间留一个空格,函数名与参数括号相连。小括号、数组方括号内侧无空格,非空对象字面量的大括号内侧各留一个空格。二元运算符两侧留空格,属性冒号后留空格。

推荐 单行以 100 字符为目标,字符串、模板字符串和正则等不宜拆分时可例外。

参考 文件约 1000 行或函数约 80 行时,检查能否按职责拆分。

3. 变量和数据 ​

3.1. 变量声明 ​

强制 使用 const 或 let。不重新赋值的绑定使用 const,需要重新赋值时使用 let。每条声明只定义一个变量,解构声明按同一绑定模式处理。

强制 先声明再使用。删除未用声明,禁止重复声明、遮蔽外层变量及连续赋值。

参考 在首次使用附近声明变量,保持作用域尽可能小。

3.2. 原始类型和字符串 ​

强制 字符串优先用单引号,去掉无效转义。在已有布尔语义的条件中省略多余转换。禁止用 new 创建原始类型包装对象。

推荐 显式转换可用 Number()、String() 或 !!。整数解析使用 parseInt() 并传入基数。变量插值优先用模板字符串。

3.3. 数组 ​

强制 用数组字面量创建普通数组。对 map、filter、reduce 等依赖返回值的方法,回调的每条正常路径都返回预期值。

推荐 使用数组解构读取固定位置。可迭代值可用扩展语法展开,非可迭代的类数组用 Array.from() 转换。展开复制为浅复制。

js
export function getActiveIds(users) {
  return users.filter((user) => user.active).map((user) => user.id);
}

3.4. 对象 ​

强制 普通对象使用字面量,并采用属性及方法简写。属性名仅在语法需要时加引号。已知且可用标识符表示的属性用点号访问,动态键使用方括号。

强制 检查自有属性时,目标环境支持可用 Object.hasOwn()。兼容旧环境时可用 Object.prototype.hasOwnProperty.call()。不得直接调用实例的 hasOwnProperty 等原型方法。

推荐 用解构读取所需字段,用扩展语法合并普通数据对象。合并前明确覆盖顺序,涉及嵌套对象时确认浅复制是否足够。

参考 同类简写属性集中书写,动态键优先在对象字面量中定义。

js
export function makeOptions(defaults, overrides, mode) {
  return {
    ...defaults,
    ...overrides,
    mode,
  };
}

4. 函数和类 ​

4.1. 函数 ​

强制 禁止用 Function 构造器创建函数。代码块内需要定义函数时使用绑定加函数表达式。匿名回调优先用箭头函数,依赖动态 this 的回调保留普通函数。

强制 参数禁止命名为 arguments。可变参数用剩余参数收集。立即执行函数表达式用小括号包裹。生成器函数体包含 yield。

推荐 箭头函数参数保留括号,单一返回表达式可省略函数体大括号。直接返回对象字面量时给对象加小括号。

推荐 默认参数放在普通必填参数之后,剩余参数保持末尾。避免修改参数绑定或入参对象。

参考 优先用合适的数组方法表达迭代意图。参数多时考虑参数对象,圈复杂度约 10 或认知复杂度约 15 时检查是否需拆分。

js
export function getLabels(items, prefix = 'item') {
  return items.map(({ id }) => `${prefix}-${id}`);
}

4.2. 类 ​

推荐 使用 class 声明类,使用 extends 声明继承关系。

强制 省略无额外逻辑的构造函数。派生类显式编写构造函数时,在使用 this 前调用 super()。类成员不得重复定义。

5. 模块和控制流 ​

5.1. 模块依赖 ​

推荐 新代码优先使用 ESM。维护 CommonJS 模块时遵循现有边界。选择发布格式时以实际消费者、运行时和构建工具为依据。

强制 静态导入集中在模块顶部。同一来源的导入合并,禁止模块自引用及循环依赖。默认导入的本地名称不与源模块的其他命名导出混淆。

推荐 导入后留一空行。已作为命名导出的成员直接按名导入,避免从默认导出对象上读取同名成员。

参考 导入按内置模块、第三方依赖、项目内模块分组。保留有副作用导入的执行顺序。公开导出形式以模块职责和项目约定为准。

5.2. 操作符和分支 ​

推荐 比较时使用 === 和 !==,需要转换时先显式转换类型。

强制 禁止使用 ++、--、void,以及嵌套或冗余的三元表达式。混合运算容易误读时用小括号明确分组。循环计数器方向须与退出条件一致。

强制 switch 中有执行逻辑的分支用 break、return 或 throw 明确退出。禁止意外贯穿到下一分支。

推荐 switch 提供 default,有意省略时说明原因。遍历对象自有键优先用 Object.keys(),使用 for...in 时先检查键是否自有。

参考 用提前返回减少嵌套。少量简单分支可用 if,同一值有多个离散分支时考虑 switch。

5.3. 调试和运行时安全 ​

强制 禁止使用 eval,禁止提交 debugger,禁止覆盖原生对象和只读全局变量。

推荐 避免使用 alert 和遗留的调试 console。生产诊断日志使用项目约定的日志接口。

6. 注释和命名 ​

6.1. 注释 ​

强制 注释内容和分隔符之间留一个空格。

推荐 单行注释用 //,放在被说明代码上方。除块首或连续注释外,注释上方留一空行。多行说明使用块注释。

参考 解释约束、原因和边界条件。公开接口可使用 JSDoc,待办事项用清楚的标记,及时删除失效注释及注释掉的代码。

6.2. 命名 ​

强制 类和构造函数使用大驼峰,例如 OrderService。

参考 变量、函数、实例及导出的函数用小驼峰。普通文件名使用小写,多个单词以短横线分隔,例如 order-service.js。

参考 全大写下划线命名用于对外导出的稳定常量。对象属性沿用普通命名,不因对象导出而统一大写。避免用前后下划线模拟私有性。