JavaScript 规范
变量声明
- 对所有变量的声明都应该优先使用
const
,其次考虑let
,不要使用var
。
原因:
确保你定义的变量无法被重新分配,以避免出现数据被篡改的问题。
// ❌ bad
var num = 1
// ✅ good
const num = 1
- 当我们想要定义一个变量而不是常量时,使用
let
,不要使用var
。
原因:
let
属于块级作用域,而 var
属于函数级作用域,存在变量提升、闭包、可重复声明、全局变量自动挂载 window 对象等问题,使用 var
易导致错误引用。
// ❌ bad
console.log(count) // 输出 undefined。
if (Math.random() >= 0.5) {
var count = 1 // count 变量包裹在花括号内,直觉告诉我们这块数据很安全,但实际却是我们在外部也能够访问,而且还能够修改它,这是 var 函数级作用域存在的缺陷
}
console.log(count) // 输出 1。
// ✅ good
console.log(count) // 报错 ReferenceError: count is not defined。
if (Math.random() >= 0.5) {
let count = 1
}
console.log(count) // 报错 ReferenceError: count is not defined。
命名规范
- 变量名使用小驼峰命名规则,推荐使用有意义的纯英文单词组合,不要使用拼音、拼音缩写或纯数字。
原因:
没有特别的原因,主要是为了保持风格统一,提高代码的可读性和可维护性。
// ❌ bad
const first_name = 'Andy'
const nameA = 'Andy'
const name1 = 'Andy'
const mingzi = 'Andy'
const mz = 'Andy'
// ✅ good
const firstName = 'Andy'
- 对于公共常量,推荐使用「英文单词全大写 + 下划线」组合。多用于全局环境变量文件、配置文件、工具类文件中。
// ✅ good
const APP_TITLE = '应用名称'
const BASE_URL = 'https://www.xxx.com/'
const TOKEN_KEY = 'token-key'
对象
- 请使用对象属性值、对象方法的简写方式。
原因:
更简洁、更直观、减少冗余代码。
const name = 'Andy'
// ❌ bad
const user = {
name: name,
intro: function () {
console.log(`My name is ${this.name}`)
}
}
// ✅ good
const user = {
name,
intro () {
console.log(`My name is ${this.name}`)
}
}
逻辑运算
- 请使用等同符
===
,不要使用等值符==
。唯一考虑使用==
的场景是一个变量的值可能为null || undefined
时,此时可以使用obj == null
达到简化代码的目的。
原因:
等同符 ===
需要确保类型和值都完全匹配,等值符 ==
只需要转换后值相等即可。==
由于存在隐式强制类型转换,导致结果难以预测,且转换规则复杂且难以记忆。
const num = 2
const strNum = '2'
// ❌ bad
console.log(num == strNum) // true
console.log('0' == false) // true。逆天结果
console.log(false == '') // true。逆天结果
console.log(null == undefined) // true。逆天结果
// ✅ good
console.log(num === strNum) // false
console.log(Number(strNum) === num) // true
console.log('0' == false) // false
console.log(false == '') // false
console.log(null == undefined) // false