Skip to content

编写清洁代码

编写清洁代码

JavaScript 风格指南

JavaScript 风格指南是一套标准,告诉我们如何编写和组织 JavaScript 代码。在本节中,我们将讨论 JavaScript 指南以及如何编写清洁代码。

JavaScript 是一种编程语言,就像人类语言一样,它有语法。JavaScript 的语法必须遵循某种风格指南来编写,以便于方便和简单。

为什么我们需要风格指南

你已经独自编码很长时间了,但现在似乎要在团队中工作。只要代码能运行,你如何编写代码并不重要,但是当你在一个有10个或20个或更多开发人员的团队中工作在一个项目和同一个代码库上时,如果没有任何指南可遵循,代码将会混乱且难以管理。

你可以开发自己的指南和约定,或者你也可以采用已经开发好的指南。让我们看看最常见的已知指南。

最常见的 JavaScript 风格指南

  • Airbnb JavaScript 风格指南
  • JavaScript 标准风格指南
  • Google JavaScript 风格指南

Airbnb JavaScript 风格指南

Airbnb 在互联网上拥有最受欢迎的 JavaScript 风格指南之一。它几乎涵盖了 JavaScript 的每个方面,并被许多开发人员和公司采用。你可以查看 Airbnb 风格指南。我也建议尝试一下。他们的风格非常易于使用且简单易懂。

标准 JavaScript 风格指南

这个指南不如 Airbnb 受欢迎,但值得一看。他们在他们的风格指南中删除了分号。

Google JavaScript 风格指南

我对 Google 的指南没有太多要说的,我也没有使用过,但我建议你从这个链接看一看。

JavaScript 编码约定

在这个挑战中,我们也使用了一般的 JavaScript 编码编写约定和指南。编码约定是由个人、团队或公司开发的编程风格指南。

编码约定有助于:

  • 编写清洁代码
  • 提高代码可读性
  • 提高代码的可重用性和可维护性

编码约定包括

  • 变量的命名和声明规则
  • 函数的命名和声明规则
  • 空白、缩进和注释的使用规则
  • 编程实践和原则

30DaysOfJavaScript 中使用的约定

在这个挑战中,我们遵循常规的 JavaScript 约定,但我也添加了我的编写偏好。

  • 我们对变量和函数使用驼峰命名法。
  • 所有变量名都以字母开头。
  • 我们选择对常量、数组、对象和函数使用 const。我们选择使用单引号或反引号而不是双引号。单引号正在成为趋势。
  • 我们也从代码中删除了分号,但这是个人偏好的问题。
  • 算术运算符、赋值运算符周围的空格以及逗号后的空格
  • 箭头函数而不是函数声明
  • 如果函数是一行的,则显式返回而不是隐式返回
  • 对象最后一个值中没有尾随逗号
  • 我们更喜欢这个 +=、-=、*=、/=、**= 而不是更长的版本
  • 当我们使用 console.log() 时,最好用标签字符串打印以识别控制台来自哪里

变量

js

let firstName = 'Asabeneh'
let lastName = 'Yetayeh'
let country = 'Finland'
let city = 'Helsinki'

const PI = Math.PI
const gravity = 9.81

数组

我们选择使数组名称为复数

  • names
  • numbers
  • countries
  • languages
  • skills
  • fruits
  • vegetables
js
// 数组
const names = ['Asabeneh', 'Mathias', 'Elias', 'Brook']
const numbers = [0, 3.14, 9.81, 37, 98.6, 100]
const countries = ['Finland', 'Denmark', 'Sweden', 'Norway', 'Iceland']
const languages = ['Amharic', 'Arabic', 'English', 'French', 'Spanish']
const skills = ['HTML', 'CSS', 'JavaScript', 'React', 'Python']
const fruits = ['banana', 'orange', 'mango', 'lemon']
const vegetables = ['Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']

函数

到现在为止,你已经非常熟悉函数声明、表达式函数、箭头函数和匿名函数。在这个挑战中,我们倾向于使用箭头函数而不是其他函数。箭头函数不是其他函数的替代品。此外,箭头函数和函数声明并不完全相同。所以你应该知道何时使用以及何时不使用。我将在其他部分详细介绍差异。如果函数是一行的,我们将使用显式返回而不是隐式返回

js
// 返回一个人全名的函数
const printFullName = (firstName, lastName) => firstName + ' ' + lastName

// 计算数字平方的函数
const square = (n) => n * n

// 生成随机十六进制颜色的函数
const hexaColor = () => {
  const str = '0123456789abcdef'
  let hexa = '#'
  let index
  for (let i = 0; i < 6; i++) {
    index = Math.floor(Math.random() * str.length)
    hexa += str[index]
  }
  return hexa
}

// 显示日期和时间的函数
const showDateTime = () => {
  const now = new Date()
  const year = now.getFullYear()
  const month = now.getMonth() + 1
  const date = now.getDate()
  let hours = now.getHours()
  let minutes = now.getMinutes()
  if (hours < 10) {
    hours = '0' + hours
  }
  if (minutes < 10) {
    minutes = '0' + minutes
  }

  const dateMonthYear = date + '.' + month + '.' + year
  const time = hours + ':' + minutes
  const fullTime = dateMonthYear + ' ' + time
  return fullTime
}

new Date().toLocaleString() 也可以用来显示当前日期时间。toLocaleString() 方法接受不同的参数。你可以从这个链接了解更多关于日期和时间的信息。

循环

我们在这个挑战中涵盖了许多类型的循环。常规的 for 循环、while 循环、do while 循环、for of 循环、forEach 循环和 for in 循环。 让我们看看我们如何使用它们:

js
for (let i = 0; i < n; i++){
    console.log()
}

// 声明一个数组变量
const names = ['Asabeneh', 'Mathias', 'Elias', 'Brook']

// 使用常规 for 循环迭代数组
let len = names.length;
for(let i = 0; i < len; i++){
    console.log(names[i].toUpperCase())
}


// 使用 for of 迭代数组
for( const name of names) {
    console.log(name.toUpperCase())
}

// 使用 forEach 迭代数组
names.forEach((name) => name.toUpperCase())


const person = {
  firstName: 'Asabeneh',
  lastName: 'Yetayeh',
  age: 250,
  country: 'Finland',
  city: 'Helsinki',
  skills: ['HTML','CSS','JavaScript','React','Node','MongoDB','Python','D3.js'],
  isMarried: true
}
for(const key in person) {
    console.log(key)
}

对象

我们用 const 声明对象字面量。

js
// 声明对象字面量
const person = {
  firstName: 'Asabeneh',
  lastName: 'Yetayeh',
  age: 250,
  country: 'Finland',
  city: 'Helsinki',
  skills: ['HTML','CSS','JavaScript','TypeScript', 'React','Node','MongoDB','Python','D3.js'],
  isMarried: true
}
// 迭代对象键
for(const key in person) {
    console.log(key, person[key])
}

条件语句

我们在之前的挑战中说过 if、if else、if else if else、switch 和三元运算符。

js
// 语法
if (condition) {
 // 这部分代码为真条件运行
} else {
 // 这部分代码为假条件运行
}
js
// if else
let num = 3
if (num > 0) {
 console.log(`${num} is a positive number`)
} else {
 console.log(`${num} is a negative number`)
}
//  3 is a positive number
js
// if else if else if else

let a = 0
if (a > 0) {
 console.log(`${a} is a positive number`)
} else if (a < 0) {
 console.log(`${a} is a negative number`)
} else if (a == 0) {
 console.log(`${a} is zero`)
} else {
 console.log(`${a} is not a number`)
}
js
// Switch 更多示例
let dayUserInput = prompt('What day is today ?')
let day = dayUserInput.toLowerCase()

switch (day) {
 case 'monday':
   console.log('Today is Monday')
   break
 case 'tuesday':
   console.log('Today is Tuesday')
   break
 case 'wednesday':
   console.log('Today is Wednesday')
   break
 case 'thursday':
   console.log('Today is Thursday')
   break
 case 'friday':
   console.log('Today is Friday')
   break
 case 'saturday':
   console.log('Today is Saturday')
   break
 case 'sunday':
   console.log('Today is Sunday')
   break
 default:
   console.log('It is not a week day.')
}
js
// 三元运算符

let isRaining = true
isRaining
 ? console.log('You need a rain coat.')
 : console.log('No need for a rain coat.')

我们用驼峰命名法声明类,以大写字母开头。

js
// 语法
class ClassName {
    // 代码在这里
}
js
// 定义类
class Person {
  constructor(firstName, lastName) {
    console.log(this) // 从这里检查输出
    this.firstName = firstName
    this.lastName = lastName
  }
}

无论你遵循什么风格指南,都要保持一致。遵循一些编程范式和设计模式。记住,如果你不按照某种顺序或方式编写代码,将很难阅读你的代码。所以,为了你自己或为了将要阅读你代码的人,通过编写可读的代码来帮个忙。

🌕 你很整洁。现在,你知道如何编写清洁代码,所以任何懂英语的人都能理解你的代码。你总是在进步,你在通往伟大的道路上已经前进了20步。

🎉 恭喜!🎉