1. 代码风格规范
1.1 缩进与空格
缩进:使用 2 个空格 作为缩进,禁止使用 Tab。
空格:
在操作符前后添加空格,如
a + b
。在逗号后添加空格,如
function(a, b, c)
。在花括号前添加空格,如
if (condition) {
。在注释符
//
后添加空格,如// 注释
。
1.2 换行
每行代码长度:不超过 80 个字符,超出时换行。
换行规则:
在操作符后换行。
在逗号后换行。
保持代码块清晰,避免过度换行。
代码块 | ||
---|---|---|
| ||
const result = someVeryLongFunctionName(argument1, argument2, argument3) .then(data => { // 处理数据 }) .catch(error => { // 处理错误 }); |
1.3 命名规范
变量和函数:使用
camelCase
命名法,如userName
、getUserInfo
。常量:使用
UPPER_SNAKE_CASE
命名法,如MAX_COUNT
。类:使用
PascalCase
命名法,如UserModel
。私有成员:使用
_
前缀,如_privateMethod
。
代码块 | ||
---|---|---|
| ||
const MAX_COUNT = 100; function getUserInfo(userId) { // 逻辑 } class UserModel { constructor() { this._privateProperty = 'private'; } _privateMethod() { // 私有方法 } } |
1.4 引号
使用 单引号
'
作为字符串的引号,除非字符串中包含单引号。
代码块 | ||
---|---|---|
| ||
const name = 'John'; const message = "He's a developer"; |
1.5 分号
必须使用分号,避免因自动插入分号导致的潜在问题。
代码块 | ||
---|---|---|
| ||
const a = 1; const b = 2; |
1.6 花括号
始终使用花括号,即使代码块只有一行。
代码块 | ||
---|---|---|
| ||
if (condition) { doSomething(); } |
1.7 注释
单行注释:使用
//
,注释内容与符号之间保留一个空格。多行注释:使用
/* ... */
。函数注释:使用 JSDoc 格式。
代码块 | ||
---|---|---|
| ||
/ 单行注释 /* * 多行注释 */ /** * 获取用户信息 * @param {string} userId - 用户 ID * @returns {Object} 用户信息 */ function getUserInfo(userId) { // 逻辑 } |
2. 变量与常量
2.1 变量声明
使用
const
声明常量,使用let
声明变量,避免使用var
。每个声明语句只声明一个变量。
代码块 | ||
---|---|---|
| ||
const MAX_COUNT = 100;
let userName = 'John'; |
2.2 变量初始化
尽量在声明时初始化变量。
代码块 | ||
---|---|---|
| ||
let count = 0;
const name = 'John'; |
2.3 避免全局变量
避免使用全局变量,尽量将变量限制在局部作用域内。
3. 函数规范
3.1 函数命名
使用
camelCase
命名法,函数名应清晰描述其功能。
代码块 | ||
---|---|---|
| ||
function calculateTotalPrice(items) {
// 逻辑
} |
3.2 函数参数
参数数量不宜过多(建议不超过 5 个),过多时使用对象传递。
代码块 | ||
---|---|---|
| ||
function createUser({ name, age, email, address }) {
// 逻辑
} |
3.3 箭头函数
优先使用箭头函数,尤其是回调函数和匿名函数。
代码块 | ||
---|---|---|
| ||
const numbers = [1, 2, 3];
const doubled = numbers.map(num => num * 2); |
3.4 默认参数
使用默认参数替代函数内部的默认值逻辑。
代码块 | ||
---|---|---|
| ||
function greet(name = 'Guest') {
console.log(`Hello, ${name}`);
} |
4. 对象与数组
4.1 对象字面量
使用字面量创建对象,避免使用
new Object()
。
代码块 | ||
---|---|---|
| ||
const user = {
name: 'John',
age: 30,
}; |
4.2 对象属性
属性名使用
camelCase
命名法。动态属性名使用
[]
。
代码块 | ||
---|---|---|
| ||
const key = 'name';
const user = {
[key]: 'John',
}; |
4.3 数组字面量
使用字面量创建数组,避免使用
new Array()
。
代码块 | ||
---|---|---|
| ||
const numbers = [1, 2, 3]; |
4.4 数组方法
优先使用
map
、filter
、reduce
等函数式方法。
代码块 | ||
---|---|---|
| ||
const doubled = numbers.map(num => num * 2); |
5. 类与模块
5.1 类定义
使用
class
关键字定义类,避免使用原型链。
代码块 | ||
---|---|---|
| ||
class User {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, ${this.name}`);
}
} |
5.2 模块化
使用
ES Module
进行模块化开发。
代码块 | ||
---|---|---|
| ||
// user.js
export class User {
// 类定义
}
// main.js
import { User } from './user.js'; |
6. 异步编程
6.1 Promise
使用
Promise
处理异步操作,避免回调地狱。
代码块 | ||
---|---|---|
| ||
function fetchData() {
return new Promise((resolve, reject) => {
// 异步操作
});
} |
6.2 Async/Await
优先使用
async/await
替代Promise.then
。
代码块 | ||
---|---|---|
| ||
async function getUser() {
try {
const user = await fetchData();
console.log(user);
} catch (error) {
console.error(error);
}
} |
7. 错误处理
7.1 Try/Catch
使用
try/catch
捕获同步代码中的错误。
代码块 | ||
---|---|---|
| ||
try {
doSomething();
} catch (error) {
console.error(error);
} |
7.2 Promise 错误处理
使用
.catch()
或try/catch
捕获异步错误。
代码块 | ||
---|---|---|
| ||
fetchData()
.then(data => {
// 处理数据
})
.catch(error => {
console.error(error);
}); |