GGbond : 优雅提效的JS习惯

JavaScript是一门灵活而强大的编程语言,但也有一些陷阱和坏习惯。如果你想提高你的JS代码的质量和可读性,你需要遵循一些编码规范和技巧。在本文中,GGbond 将分享一些我认为有助于编写更优雅的JS代码的技巧*。

1. 使用清晰规范的命名

// 优雅的代码
const age = 25;
const fullName = "John Smith";

2. 添加注释

// 优雅的代码
/**
 * 计算长方形的面积
 * @param {number} width - 长方形的宽度
 * @param {number} height - 长方形的高度
 * @return {number} 面积
 */
function calculateArea(width, height) {
  return width * height;
}

3. 使用const和let替代var

// 优雅的代码
const name = "John";
let age = 25;
age = 26;

4. 函数尽量扁平化

// 优雅的代码
function calculateTotal(price, quantity) {
  const tax = calculateTax(price, quantity);
  return (price * quantity) + tax;
}

function calculateTax(price, quantity) {
  return price * quantity * 0.1;
}

5. 使用模板字符串

这个函数可以使用更简洁的三元运算符来替代:

function test(num) {
  return num < 0 ? -num : num;
}

6. 使用箭头函数

箭头函数可以使代码更简洁和易读。

// 不优雅代码
function add(a, b) {
  return a + b;
}

// 优雅代码
const add = (a, b) => a + b;

7. 使用模板字符串

使用模板字符串来组合字符串和变量,以避免使用繁琐的字符串连接符。

// 不优雅代码
const name = 'John';
console.log('My name is ' + name);

// 优雅代码
const name = 'John';
console.log(`My name is ${name}`);

8. 使用默认参数

使用默认参数来简化函数定义。

// 不优雅代码
function greet(name) {
  name = name || 'John';
  console.log('Hello, ' + name);
}

// 优雅代码
function greet(name = 'John') {
  console.log(`Hello, ${name}`);
}

9. 使用解构赋值

使用解构赋值来提取对象和数组中的值。

// 不优雅代码
const person = {
  name: 'John',
  age: 30
};
console.log(person.name);
console.log(person.age);

// 优雅代码
const person = {
  name: 'John',
  age: 30
};
const {name, age} = person;
console.log(name);
console.log(age);

10. 使用对象字面量

使用对象字面量来定义一个对象。

// 不优雅代码
const person = new Object();
person.name = 'John';
person.age = 30;

// 优雅代码
const person = {
  name: 'John',
  age: 30
};

11. 使用数组方法

使用数组方法来操作数组,以避免使用循环和条件语句。

// 不优雅代码
const numbers = [1, 2, 3, 4];
const doubled = [];
for(let i = 0; i < numbers.length; i++) {
  doubled.push(numbers[i] * 2);
}

// 优雅代码
const numbers = [1, 2, 3, 4];
const doubled = numbers.map(num => num * 2);

12. 使用模块化

使用模块化来分离和组织代码。

// 不优雅代码
function add(a, b) {
  return a + b;
}

function subtract(a, b) {
  return a - b;
}

// 优雅代码
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;

13. 使用Promise

使用Promise来管理异步代码。

// 不优雅代码
function getData(callback) {
  $.getJSON('<https://api.example.com/data>', function(data) {
    callback(data);
  });
}

getData(function(data) {
  console.log(data);
});

// 优雅代码
function getData() {
  return new Promise((resolve, reject) => {
    $.getJSON('<https://api.example.com/data>', function(data) {
      resolve(data);
    });
  });
}

getData().then(data => console.log(data));

14. 使用async/await

使用async/await来管理异步代码。

// 不优雅代码
function getData() {
  return new Promise((resolve, reject) => {
    $.getJSON('<https://api.example.com/data>', function(data) {
      resolve(data);
    });
  });
}

getData().then(data => {
  console.log(data);
});

// 优雅代码
async function getData() {
  const data = await $.getJSON('<https://api.example.com/data>');
  console.log(data);
}

getData();

15. 使用class

使用class来定义对象和继承。

// 不优雅代码
function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}`);
}

function Employee(name, age, job) {
  Person.call(this, name, age);
  this.job = job;
}

Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;

// 优雅代码
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

class Employee extends Person {
  constructor(name, age, job) {
    super(name, age);
    this.job = job;
  }
}

16. 使用Rest参数

使用Rest参数来接受不定数量的参数。

// 不优雅代码
function sum() {
  let total = 0;
  for(let i = 0; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total;
}

// 优雅代码
function sum(...numbers) {
  return numbers.reduce((total, num) => total + num, 0);
}

17. 使用Spread运算符

使用Spread运算符来展开数组和对象。

// 不优雅代码
const numbers = [1, 2, 3];
const total = sum(numbers[0], numbers[1], numbers[2]);

// 优雅代码
const numbers = [1, 2, 3];
const total = sum(...numbers);

18. 使用Object.assign

使用Object.assign来合并对象。

// 不优雅代码
const person = {
  name: 'John',
  age: 30
};
const info = {
  job: 'Developer'
};
const profile = {};
for(let key in person) {
  profile[key] = person[key];
}
for(let key in info) {
  profile[key] = info[key];
}

// 优雅代码
const person = {
  name: 'John',
  age: 30
};
const info = {
  job: 'Developer'
};
const profile = Object.assign({}, person, info);

19. 使用Promise.all

使用Promise.all来并行处理多个Promise。

// 不优雅代码
function getData1() {
  return new Promise((resolve, reject) => {
    $.getJSON('<https://api.example.com/data1>', function(data) {
      resolve(data);
    });
  });
}

function getData2() {
  return new Promise((resolve, reject) => {
    $.getJSON('<https://api.example.com/data2>', function(data) {
      resolve(data);
    });
  });
}

Promise.all([getData1(), getData2()]).then(([data1, data2]) => {
  console.log(data1, data2);
});

// 优雅代码
const getData1 = () => $.getJSON('<https://api.example.com/data1>');
const getData2 = () => $.getJSON('<https://api.example.com/data2>');

Promise.all([getData1(), getData2()]).then(([data1, data2]) => {
  console.log(data1, data2);
});

20. 使用展开运算符

// 优雅的代码
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [...arr1, ...arr2];