本文深入解析 Google 发布的 JavaScript 代码规范,涵盖缩进、分号、变量声明、函数定义及字符串处理等 13 条核心规则。通过对比 Airbnb 规范与官方示例,阐述如何编写简洁、一致且可维护的 JS 代码,帮助开发者提升代码质量。
Google 针对不熟悉代码规范的开发者,发布了一份 JavaScript 编码标准,旨在列出编写简洁、易读代码的最佳实践。
该规范并非强制性的正确性规则,而是为了保持源代码风格的一致性。鉴于 JavaScript 语言灵活且约束较少,允许开发者采用多种编码风格,因此统一规范尤为重要。
目前,Google 与 Airbnb 的编码规范各占流行规范的一半。若你长期投入 JavaScript 开发,强烈建议通读这两家公司的规范文档。
下文将梳理 Google 规范中与我日常开发密切相关的 13 条规则。
这些规则涉及诸多争议话题,如 Tab 与空格的使用、是否强制使用分号等。部分规则令人意外,甚至改变了我编写 JS 的习惯。
针对每条规则,我将先给出规范摘要,再引用详细说明,并辅以适当的反例,以论证遵守规则的重要性。
使用空格代替 Tab
除行终止符序列外,ASCII 水平空格符(0x20)是唯一允许出现在源文件任意位置的空格字符。这意味着不应使用 Tab 字符,也不应用其控制缩进。
规范进一步指出,应使用 2 个空格而非 4 个空格来实现缩进。
// bad
function foo() {
∙∙∙∙let name;
}
// bad
function bar() {
∙let name;
}
// good
function baz() {
∙∙let name;
}
不可省略分号
每条语句必须以分号结尾。严禁依赖 JavaScript 的自动分号插入(ASI)机制。
尽管我不理解反对该规则的理由,但分号的使用争议已如“空格与 Tab”之争般巨大。Google 明确表示:分号必须存在,不可省略。
// bad
let luke = {}
let leia = {}
[luke, leia].forEach(jedi => jedi.father = 'vader')
// good
let luke = {};
let leia = {};
[luke, leia].forEach((jedi) => {
jedi.father = 'vader';
});
暂不使用 ES6 模块
鉴于 ES6 模块的语义尚未完全确定,建议暂时不要使用 export 和 import 等关键字。待相关规范制定完成后,可忽略此条限制。
// 暂时不要编写下面的代码:
//------ lib.js ------
export function square(x) {
return x * x;
}
export function diag(x, y) {
return sqrt(square(x) + square(y));
}
//------ main.js ------
import { square, diag } from 'lib';
译者注:遵循此条规范在现实中可能较难实现,因为 Babel 已广泛使用。此外,React 的最佳实践通常要求使用 ES6 模块。
不推荐代码水平对齐
Google 规范允许但不推荐对代码进行水平对齐。即使已有代码进行了水平对齐,后续也应避免此类做法。
代码水平对齐会引入多余空格,使相邻两行字符看似垂直对齐,影响代码整洁度。
// bad
{
tiny: 42,
longer: 435,
};
// good
{
tiny: 42,
longer: 435,
};
杜绝 var 关键字
使用 const 或 let 声明所有局部变量。若变量无需重新赋值,默认应使用 const。应拒绝使用 var 关键字。
不知是无人能说服还是旧习难改,我仍能在 StackOverflow 等处看到许多人使用 var 声明变量。
// bad
var example = 42;
// good
const example = 42;
优先使用箭头函数
箭头函数提供了简洁语法,并避免了 this 指向问题。相较于 function 关键字,开发者应优先使用箭头函数声明函数,尤其是嵌套函数。
坦白说,我曾以为箭头函数仅用于简洁美观,现在发现其具有更重要的作用。
// bad
[1, 2, 3].map(function (x) {
const y = x + 1;
return x * y;
});
// good
[1, 2, 3].map((x) => {
const y = x + 1;
return x * y;
});
使用模板字符串取代字符串连接
处理多行字符串时,模板字符串的表现优于复杂的字符串拼接。
// bad
function sayHi(name) {
return 'How are you, ' + name + '?';
}
// bad
function sayHi(name) {
return ['How are you, ', name, '?'].join();
}
// bad
function sayHi(name) {
return `How are you, ${ name }?`;
}
// good
function sayHi(name) {
return `How are you, ${name}?`;
}
不使用续行符分割长字符串
在 JS 中,\ 也代表续行符。Google 规范禁止在模板字符串或普通字符串中使用续行符。尽管 ES5 允许此做法,但若 \ 后跟随结束空白符,可能导致难以察觉的错误。
此规则有趣之处在与 Airbnb 规范存在差异。
Google 推荐特定写法,而 Airbnb 主张顺其自然,字符串多长就多长。
// bad (建议在PC端阅读)
const longString = 'This is a very long string that \
far exceeds the 80 column limit. It unfortunately \
contains long stretches of spaces due to how the \
continued lines are indented.';
// good
const longString = 'This is a very long string that ' +
'far exceeds the 80 column limit. It does not contain ' +
'long stretches of spaces since the concatenated ' +
'strings are cleaner.';
优先使用 for...of
ES6 提供了三种 for 循环。尽管各有适用场景,Google 仍推荐使用 for...of。
Google 特别指定一种 for 循环虽显奇怪,但我接受这一观点。
以往我认为 for...in 适合遍历对象,for...of 适合遍历数组,喜欢这种各司其职的方式。
尽管 Google 规范与此用法冲突,但其对 for...of 的偏爱仍令我感到有趣。
不使用 eval 语句
除非在 code loader 中,否则不得使用 eval 或 Function(...string) 结构。该功能具有潜在危险性,且在 CSP 环境中无法生效。
MDN 中专门有一节强调不要使用 eval 语句。
// bad
let obj = { a: 20, b: 30 };
let propName = getPropName(); // returns "a" or "b"
eval( 'var result = obj.' + propName );
// good
let obj = { a: 20, b: 30 };
let propName = getPropName(); // returns "a" or "b"
let result = obj[ propName ]; // obj[ "a" ] is the same as obj.a
常量命名规范
常量命名应使用全大写格式,并用下划线分隔。
若确定变量值永不修改,可将其名称改为全大写,暗示其为常量,请勿修改其值。
遵守此规则时需注意:若常量是函数,应使用驼峰式命名法。
// bad
const number = 5;
// good
const NUMBER = 5;
每次只声明一个变量
每个变量声明应仅对应一个变量。不应出现类似 let a = 1, b = 2; 的语句。
// bad
let a = 1, b = 2, c = 3;
// good
let a = 1;
let b = 2;
let c = 3;
使用单引号
仅允许使用单引号包裹普通字符串,禁止使用双引号。若字符串包含单引号字符,应使用模板字符串。
// bad
let directive = "No identification of self or mission."
// bad
let saying = 'Say it ain\u0027t so.';
// good
let directive = 'No identification of self or mission.';
// good
let saying = `Say it ain't so`;
总结
如开头所述,规范中无强制执行的命令。尽管 Google 是科技巨头,该规范仅供参考。
Google 汇聚人才,雇佣优秀程序员编写优质代码。查看此类公司发布的规范颇具趣味。
若想在项目中实现 Google 式代码,可制定这些规范。但若你不认同该规范,也可舍弃部分规则,无人阻拦。
我个人认为在某些场景下,Airbnb 规范优于 Google 规范。无论支持哪种或编写何种代码,最重要的是脑海中始终遵守同一份规范。
总结
以上为小编介绍的 Google JavaScript 代码规范要点,希望对大家有所帮助。如有疑问请留言,小编会及时回复。感谢大家对本站的支持!