深入“JS” 前端,从 规范 开始 👀

858 阅读6分钟


命名规范

1 、 避免单字母的名字。用你的命名来描述功能(最好使用动词命名)。

2 、在命名对象、函数和实例时使用驼峰命名法(camelCase)。

3 、 只有在命名构造器或者类的时候才用帕斯卡拼命名法。(PascalCase 每个单词的第一个字母都大写)

class User {
  constructor(options) {
    this.name = options.name;
  }
}
const good = new User({
  name: 'yup',
});

4 、不要使用前置或者后置下划线。

5 、文件名应该和默认导出的名称完全匹配。

6 、当你导出一个构造器 / 类 / 单例 / 函数库 / 暴露的对象时应该使用帕斯卡命名法。

7 、 缩略词和缩写都必须是全部大写或者全部小写。

变量

1、使用 const 或者 let 来定义变量。避免污染全局命名空间。(最好使用名词命名) 把 const 声明的放在一起,把 let 声明的放在一起。 这在后边如果需要根据前边的赋值变量指定一个变量时很有用。

2、在你需要的使用定义变量,但是要把它们放在一个合理的地方。 let 和 const 是块级作用域而不是函数作用域。

3、不要链式变量赋值。 链式变量赋值会创建隐式全局变量。

(function example() {
  let a = 1;
  let b = a;
  let c = a;
}());
console.log(a); // throws ReferenceError
console.log(b); // throws ReferenceError
console.log(c); // throws ReferenceError
// 对于 `const` 也一样

注释

 1、使用 /** ... */ 来进行多行注释。

 2、使用 // 进行单行注释。 将单行注释放在需要注释的行的上方新行。 在注释之前放一个空行,除非它在块的第一行。

空格

1、使用 tabs (空格字符) 设置为 2 个空格。

2、在主体前放置一个空格。

3、在控制语句(if, while 等)开始括号之前放置一个空格。 在函数调用和是声明中,在参数列表和函数名之间没有空格。

4、用空格分离操作符。

5、在块和下一个语句之前留下一空白行。

6、不要在括号内添加空格。

7、 不要在中括号中添加空格。

8、在花括号内添加空格。 const foo = { clark: 'kent' };

9、要求打开的块标志和同一行上的标志拥有一致的间距。此规则还会在同一行关闭的块标记和前边的标记强 制实施一致的间距。

10、逗号之前避免使用空格,逗号之后需要使用空格。

11、 在行的末尾避免使用空格。

分号

每一行结束加分号结尾

方法

1、使用命名的函数表达式代替函数声明。 函数声明是挂起的,这意味着在它在文件中定义之前,很容易引用函数。这会损害可读性和可维护性。 // 从变量引用调用中区分的词汇名称

const short = function longUniqueMoreDescriptiveLexicalFoo() {
  // ...
};

2、 Wrap立即调用函数表达式。 立即调用的函数表达式是单个单元 - 包装, 并且拥有括号调用, 在括号内, 清晰的表达式。

(function () {
  console.log('Welcome to the Internet. Please follow me.');
}());

3、切记不要在非功能块中声明函数 (if, while, 等)。 将函数赋值给变量。

4、 避免使用默认参数的副作用。 他们很容易混淆。

5、 总是把默认参数放在最后。

6、 函数签名中的间距。 一致性很好,在删除或添加名称时不需要添加或删除空格。

7、 优先使用扩展运算符 ... 来调用可变参数函数 它更加干净,你不需要提供上下文。

箭头函数

1、 当你必须使用匿名函数时 (当传递内联函数时), 使用箭头函数。 它创建了一个在 this 上下文中执行的函数版本,它通常是你想要的,并且是一个更简洁的语法。 如果你有一个相当复杂的函数,你可以把这个逻辑转移到它自己的命名函数表达式中。

[1, 2, 3].map((x) => {
  const y = x + 1;
  return x * y;
});

2、 如果表达式跨越多个行,用括号将其括起来,以获得更好的可读性。 它清楚地显示了函数的起点和终点。

['get', 'post', 'put'].map(httpMethod => (
  Object.prototype.hasOwnProperty.call(
    httpMagicObjectWithAVeryLongName,
    httpMethod,
  )
));

3、 如果你的函数接收一个参数,则可以不用括号,省略括号。 否则,为了保证清晰和一致性,需要在参数周围加上括号。 注意:总是使用括号是可以接受的,在这种情况下,我们使用 “always” option 来配置减少视觉上的混乱。

4、避免箭头函数符号 (=>) 和比较运算符 (<=, >=) 的混淆。

5、 注意带有隐式返回的箭头函数函数体的位置。

(foo) => bar;
(foo) => (bar);
(foo) => (
  bar
)

类和构造器

1、 尽量使用 class. 避免直接操作 prototype . class 语法更简洁,更容易推理。

class Queue {
  constructor(contents = []) {
    this.queue = [...contents];
  }
  pop() {
    const value = this.queue[0];
    this.queue.splice(0, 1);
    return value;
  }
}

2、 使用 extends 来扩展继承。 它是一个内置的方法,可以在不破坏 instanceof 的情况下继承原型功能。

class PeekableQueue extends Queue {
  peek() {
    return this.queue[0];
  }
}

3、 方法返回了 this 来供其内部方法调用。

class Jedi {
  jump() {
    this.jumping = true;
    return this;
  }
  setHeight(height) {
    this.height = height;
    return this;
  }
}
const luke = new Jedi();
luke.jump()
.setHeight(20);

4、 如果没有指定类,则类具有默认的构造器。 一个空的构造器或是一个代表父类的函数是没有必要的。

class Rey extends Jedi {
  constructor(...args) {
    super(...args);
    this.name = 'Rey';
  }
}

5、避免定义重复的类成员。 重复的类成员声明将会默认倾向于最后一个 - 具有重复的类成员可以说是一个错误。

class Foo {
  bar() { return 1; }
}
class Foo {
  bar() { return 2; }
}

比较运算符和等号

1、 使用 === 和 !== 而不是 == 和 !=。

2、 条件语句,例如 if 语句使用 ToBoolean 的抽象方法来计算表达式的结果,并始终遵循以下简单的规则: Objects 的取值为: true Undefined 的取值为: false Null 的取值为: false Booleans 的取值为: 布尔值的取值 Numbers 的取值为:如果为 +0, -0, or NaN 值为 false 否则为 true Strings 的取值为: 如果是一个空字符串 '' 值为 false 否则为 true

3、 对于布尔值使用简写,但是对于字符串和数字进行显式比较。

4、 获取更多信息请查看 Angus Croll 的 Truth Equality and JavaScript 。

5、 在 case 和 default 的子句中,如果存在声明 (例如. let, const, function, 和 class),使用大括号来创建块 。

6、 三目表达式不应该嵌套,通常是单行表达式。

7、 避免不必要的三目表达式。

8、 使用该混合运算符时,使用括号括起来。 唯一例外的是标准算数运算符 (+, -, *, & /) 因为他们的优先级被广泛理解。 这能提高可读性并且表明开发人员的意图。

const foo = (a && b < 0) || c > 0 || (d + 1 === 0);
const bar = (a ** b) - (5 % d);
if (a || (b && c)) {
  return d;
}
const bar = a + b / c * d;

代码块

1、 当有多行代码块的时候,使用大括号包裹。

2、 如果你使用的是 if 和 else 的多行代码块,则将 else 语句放在 if 块闭括号同一行的位置。

3、 如果一个 if 块总是执行一个 return 语句,那么接下来的 else 块就没有必要了。 如果一个包含 return 语句的 else if 块,在一个包含了 return 语句的 if 块之后,那么可以拆成多个 if 块。

function cats() {
  if (x) {
    return x;
  }
  if (y) {
    return y;
  }
}

function dogs(x) {
  if (x) {
    if (z) {
      return y;
    }
  } else {
    return z;
  }
}