2.2 结构【强制】

2.2.1 缩进

【强制】 使用 4 个空格做为一个缩进层级,不允许使用 2 个空格 或 tab 字符。
【强制】 switch 下的 casedefault 必须增加一个缩进层级。

示例:

  1. // good
  2. switch (variable) {
  3. case '1':
  4. // do...
  5. break;
  6. case '2':
  7. // do...
  8. break;
  9. default:
  10. // do...
  11. }
  12. // bad
  13. switch (variable) {
  14. case '1':
  15. // do...
  16. break;
  17. case '2':
  18. // do...
  19. break;
  20. default:
  21. // do...
  22. }

2.2.2 空格

【强制】 二元运算符两侧必须有一个空格,一元运算符与操作对象之间不允许有空格。

示例:

  1. var a = !arr.length;
  2. a++;
  3. a = b + c;
【强制】 用作代码块起始的左花括号 { 前必须有一个空格。

示例:

  1. // good
  2. if (condition) {
  3. }
  4. while (condition) {
  5. }
  6. function funcName() {
  7. }
  8. // bad
  9. if (condition){
  10. }
  11. while (condition){
  12. }
  13. function funcName(){
  14. }
【强制】 if / else / for / while / function / switch / do / try / catch / finally 关键字后,必须有一个空格。

示例:

  1. // good
  2. if (condition) {
  3. }
  4. while (condition) {
  5. }
  6. (function () {
  7. })();
  8. // bad
  9. if(condition) {
  10. }
  11. while(condition) {
  12. }
  13. (function() {
  14. })();
【强制】 在对象创建时,属性中的 : 之后必须有空格,: 之前不允许有空格。

示例:

  1. // good
  2. var obj = {
  3. a: 1,
  4. b: 2,
  5. c: 3
  6. };
  7. // bad
  8. var obj = {
  9. a : 1,
  10. b:2,
  11. c :3
  12. };
【强制】 函数声明、具名函数表达式、函数调用中,函数名和 ( 之间不允许有空格。

示例:

  1. // good
  2. function funcName() {
  3. }
  4. var funcName = function funcName() {
  5. };
  6. funcName();
  7. // bad
  8. function funcName () {
  9. }
  10. var funcName = function funcName () {
  11. };
  12. funcName ();
【强制】 ,; 前不允许有空格。

示例:

  1. // good
  2. callFunc(a, b);
  3. // bad
  4. callFunc(a , b) ;
【强制】 在函数调用、函数声明、括号表达式、属性访问、if / for / while / switch / catch 等语句中,()[] 内紧贴括号部分不允许有空格。

示例:

  1. // good
  2. callFunc(param1, param2, param3);
  3. save(this.list[this.indexes[i]]);
  4. needIncream && (variable += increament);
  5. if (num > list.length) {
  6. }
  7. while (len--) {
  8. }
  9. // bad
  10. callFunc( param1, param2, param3 );
  11. save( this.list[ this.indexes[ i ] ] );
  12. needIncreament && ( variable += increament );
  13. if ( num > list.length ) {
  14. }
  15. while ( len-- ) {
  16. }
【强制】 单行声明的数组与对象,如果包含元素,{}[] 内紧贴括号部分不允许包含空格。

解释:

声明包含元素的数组与对象,只有当内部元素的形式较为简单时,才允许写在一行。元素复杂的情况,还是应该换行书写。

示例:

  1. // good
  2. var arr1 = [];
  3. var arr2 = [1, 2, 3];
  4. var obj1 = {};
  5. var obj2 = {name: 'obj'};
  6. var obj3 = {
  7. name: 'obj',
  8. age: 20,
  9. sex: 1
  10. };
  11. // bad
  12. var arr1 = [ ];
  13. var arr2 = [ 1, 2, 3 ];
  14. var obj1 = { };
  15. var obj2 = { name: 'obj' };
  16. var obj3 = {name: 'obj', age: 20, sex: 1};
【强制】 行尾不得有多余的空格。

2.2.3 换行

【强制】 每个独立语句结束后必须换行。
【强制】 每行不得超过 120 个字符。

解释:

超长的不可分割的代码允许例外,比如复杂的正则表达式。长字符串不在例外之列。

【强制】 运算符处换行时,运算符必须在新行的行首。

示例:

  1. // good
  2. if (user.isAuthenticated()
  3. && user.isInRole('admin')
  4. && user.hasAuthority('add-admin')
  5. || user.hasAuthority('delete-admin')
  6. ) {
  7. // Code
  8. }
  9. var result = number1 + number2 + number3
  10. + number4 + number5;
  11. // bad
  12. if (user.isAuthenticated() &&
  13. user.isInRole('admin') &&
  14. user.hasAuthority('add-admin') ||
  15. user.hasAuthority('delete-admin')) {
  16. // Code
  17. }
  18. var result = number1 + number2 + number3 +
  19. number4 + number5;
【强制】 在函数声明、函数表达式、函数调用、对象创建、数组创建、for语句等场景中,不允许在 ,; 前换行。

示例:

  1. // good
  2. var obj = {
  3. a: 1,
  4. b: 2,
  5. c: 3
  6. };
  7. foo(
  8. aVeryVeryLongArgument,
  9. anotherVeryLongArgument,
  10. callback
  11. );
  12. // bad
  13. var obj = {
  14. a: 1
  15. , b: 2
  16. , c: 3
  17. };
  18. foo(
  19. aVeryVeryLongArgument
  20. , anotherVeryLongArgument
  21. , callback
  22. );
【建议】 不同行为或逻辑的语句集,使用空行隔开,更易阅读。

示例:

  1. // 仅为按逻辑换行的示例,不代表setStyle的最优实现
  2. function setStyle(element, property, value) {
  3. if (element == null) {
  4. return;
  5. }
  6. element.style[property] = value;
  7. }
【建议】 在语句的行长度超过 120 时,根据逻辑条件合理缩进。

示例:

  1. // 较复杂的逻辑条件组合,将每个条件独立一行,逻辑运算符放置在行首进行分隔,或将部分逻辑按逻辑组合进行分隔。
  2. // 建议最终将右括号 ) 与左大括号 { 放在独立一行,保证与 if 内语句块能容易视觉辨识。
  3. if (user.isAuthenticated()
  4. && user.isInRole('admin')
  5. && user.hasAuthority('add-admin')
  6. || user.hasAuthority('delete-admin')
  7. ) {
  8. // Code
  9. }
  10. // 按一定长度截断字符串,并使用 + 运算符进行连接。
  11. // 分隔字符串尽量按语义进行,如不要在一个完整的名词中间断开。
  12. // 特别的,对于HTML片段的拼接,通过缩进,保持和HTML相同的结构。
  13. var html = '' // 此处用一个空字符串,以便整个HTML片段都在新行严格对齐
  14. + '<article>'
  15. + '<h1>Title here</h1>'
  16. + '<p>This is a paragraph</p>'
  17. + '<footer>Complete</footer>'
  18. + '</article>';
  19. // 也可使用数组来进行拼接,相对 + 更容易调整缩进。
  20. var html = [
  21. '<article>',
  22. '<h1>Title here</h1>',
  23. '<p>This is a paragraph</p>',
  24. '<footer>Complete</footer>',
  25. '</article>'
  26. ];
  27. html = html.join('');
  28. // 当参数过多时,将每个参数独立写在一行上,并将结束的右括号 ) 独立一行。
  29. // 所有参数必须增加一个缩进。
  30. foo(
  31. aVeryVeryLongArgument,
  32. anotherVeryLongArgument,
  33. callback
  34. );
  35. // 也可以按逻辑对参数进行组合。
  36. // 最经典的是baidu.format函数,调用时将参数分为“模板”和“数据”两块
  37. baidu.format(
  38. dateFormatTemplate,
  39. year, month, date, hour, minute, second
  40. );
  41. // 当函数调用时,如果有一个或以上参数跨越多行,应当每一个参数独立一行。
  42. // 这通常出现在匿名函数或者对象初始化等作为参数时,如setTimeout函数等。
  43. setTimeout(
  44. function () {
  45. alert('hello');
  46. },
  47. 200
  48. );
  49. order.data.read(
  50. 'id=' + me.model.id,
  51. function (data) {
  52. me.attchToModel(data.result);
  53. callback();
  54. },
  55. 300
  56. );
  57. // 链式调用较长时采用缩进进行调整。
  58. $('# items')
  59. .find('.selected')
  60. .highlight()
  61. .end();
  62. // 三元运算符由3部分组成,因此其换行应当根据每个部分的长度不同,形成不同的情况。
  63. var result = thisIsAVeryVeryLongCondition
  64. ? resultA : resultB;
  65. var result = condition
  66. ? thisIsAVeryVeryLongResult
  67. : resultB;
  68. // 数组和对象初始化的混用,严格按照每个对象的 { 和结束 } 在独立一行的风格书写。
  69. var array = [
  70. {
  71. // ...
  72. },
  73. {
  74. // ...
  75. }
  76. ];
【建议】 对于 if...else...try...catch...finally 等语句,推荐使用在 } 号后添加一个换行 的风格,使代码层次结构更清晰,阅读性更好。

示例:

  1. if (condition) {
  2. // some statements;
  3. }
  4. else {
  5. // some statements;
  6. }
  7. try {
  8. // some statements;
  9. }
  10. catch (ex) {
  11. // some statements;
  12. }

2.2.4 语句

【强制】 不得省略语句结束的分号。
【强制】if / else / for / do / while 语句中,即使只有一行,也不得省略块 {...}

示例:

  1. // good
  2. if (condition) {
  3. callFunc();
  4. }
  5. // bad
  6. if (condition) callFunc();
  7. if (condition)
  8. callFunc();
【强制】 函数定义结束不允许添加分号。

示例:

  1. // good
  2. function funcName() {
  3. }
  4. // bad
  5. function funcName() {
  6. };
  7. // 如果是函数表达式,分号是不允许省略的。
  8. var funcName = function () {
  9. };
【强制】 IIFE 必须在函数表达式外添加 (,非 IIFE 不得在函数表达式外添加 (

解释:

IIFE = Immediately-Invoked Function Expression.

额外的 ( 能够让代码在阅读的一开始就能判断函数是否立即被调用,进而明白接下来代码的用途。而不是一直拖到底部才恍然大悟。

示例:

  1. // good
  2. var task = (function () {
  3. // Code
  4. return result;
  5. })();
  6. var func = function () {
  7. };
  8. // bad
  9. var task = function () {
  10. // Code
  11. return result;
  12. }();
  13. var func = (function () {
  14. });