#JS 代码风格
强制在括号内使用空格
"array-bracket-spacing": [1, "always"]
禁止或强制在代码块中开括号前和闭括号后有空格
"block-spacing": [1, "always"]
示例:
// BAD
function foo() {return true;}
if (foo) { bar = 0;}
function baz() {let i = 0;
return i;
}
// GOOD
function foo() { return true; }
if (foo) { bar = 0; }
大括号风格要求,强制大括号与关键词在同一行
"brace-style": [1, "1tbs", { "allowSingleLine": true }]
推荐做法:
function foo() {
return true;
}
if (foo) {
bar();
}
if (foo) {
bar();
} else {
baz();
}
try {
somethingRisky();
} catch(e) {
handleError();
}
// when there are no braces, there are no problems
if (foo) bar();
else if (baz) boom();
要求在逗号周围使用空格
// 逗号前无需空格,逗号后必须空格
"comma-spacing": [1, { "before": false, "after": true }]
推荐做法:
var foo = 1, bar = 2
, baz = 3;
var arr = [1, 2];
var arr = [1,, 3]
var obj = {"foo": "bar", "baz": "qur"};
foo(a, b);
new Foo(a, b);
function foo(a, b){}
a, b
逗号风格
// "last" 要求逗号放在数组元素、对象属性或变量声明之后,且在同一行
"comma-style": [1, "last"]
推荐做法:
var foo = 1, bar = 2;
var foo = 1,
bar = 2;
var foo = ["apples",
"oranges"];
function bar() {
return {
"a": 1,
"b:": 2
};
}
强制在计算的属性的方括号中使用一致的空格
"computed-property-spacing": [1, "always"],
推荐写法:
obj[ foo ]
obj[ 'foo' ]
var x = {[ b ]: a}
obj[ foo[ bar ] ]
禁止在函数标识符和其调用之间有空格
"func-call-spacing": [1, "never"]
示例:
// BAD
fn();
fn
();
// GOOD `fn();`
要求函数名与赋值给它们的变量名或属性名相匹配
"func-name-matching": 1
示例:
// BAD
var foo = function bar() {};
foo = function bar() {};
obj.foo = function bar() {};
obj['foo'] = function bar() {};
var obj = {foo: function bar() {}};
({['foo']: function bar() {}});
// GOOD
var foo = function foo() {};
var foo = function() {};
var foo = () => {};
foo = function foo() {};
obj.foo = function foo() {};
obj['foo'] = function foo() {};
obj['foo//bar'] = function foo() {};
obj[foo] = function bar() {};
var obj = {foo: function foo() {}};
var obj = {[foo]: function bar() {}};
var obj = {'foo//bar': function foo() {}};
var obj = {foo: function() {}};
obj['x' + 2] = function bar(){};
var [ bar ] = [ function bar(){} ];
({[foo]: function bar() {}})
module.exports = function foo(name) {};
module['exports'] = function foo(name) {};
禁止命名的 function 表达式
"func-names": [2, "never"]
示例:
// BAD
Foo.prototype.bar = function bar() {};
(function bar() {
// ...
}())
// GOOD
Foo.prototype.bar = function() {};
(function() {
// ...
}())
箭头函数体不可随意换行
"implicit-arrow-linebreak": [2, "beside"]
示例:
// BAD
(foo) =>
bar;
(foo) =>
(bar);
(foo) =>
bar =>
baz;
(foo) =>
(
bar()
);
// GOOD
(foo) => bar;
(foo) => (bar);
(foo) => bar => baz;
(foo) => (
bar()
);
(foo) => {
return bar();
}
(foo) =>
{
return bar();
}
代码缩进 4 空格
"indent": [2, 4]
强制在对象字面量的键和值之间使用一致的空格
"key-spacing": [2, {
"beforeColon": false,
"afterColon": true,
"mode": "strict"
}]
示例:
// BAD
var obj = { "foo" : 42 };
var obj = { "foo":42 };
// GOOD
var obj = { "foo": 42 };
强制关键字周围必须有空格
"keyword-spacing": [2, { "before": true, "after": true }]
好的做法:
if (foo) {
//...
} else if (bar) {
//...
} else {
//...
}
要求在注释周围有空行
"lines-around-comment": [1, {
"beforeBlockComment": true, // 要求在块级注释之前有一空行
"beforeLineComment": true, // 要求在行级注释之前有一空行
}]
示例:
var night = "long";
/* what a great and wonderful day */
var day = "great"
要求在类成员之间出现空行
"lines-between-class-members": [2, "always"]
示例:
class MyClass {
foo() {
//...
}
bar() {
//...
}
}
嵌套最大深度,指的是 if 和 for 循环等的嵌套最大深度
"max-depth": [2, 5]
错误示范:
function foo() {
for (;;) { // Nested 1 deep
let val = () => (param) => { // Nested 2 deep
if (true) { // Nested 3 deep
if (true) { // Nested 4 deep
if (true) { // Nested 5 deep
}
}
}
};
}
}
强制函数最大行数 80 行,但是老项目无法执行,因为 jquery 主函数完全没上限
"max-lines-per-function": [0, 80]
要求构造函数首字母大写
"new-cap": [2, { "newIsCap": true }]
禁止使用 Array 构造函数
"no-array-constructor": 2
示例:
// BAD
Array(0, 1, 2)
new Array(0, 1, 2)
// GOOD
Array(500)
禁用按位运算符
"no-bitwise": 2
错误示范
var x = y | z;
var x = y & z;
var x = y ^ z;
var x = ~ z;
var x = y << z;
var x = y >> z;
var x = y >>> z;
x |= y;
x &= y;
x ^= y;
x <<= y;
x >>= y;
x >>>= y;
禁止混合使用不同的操作符
"no-mixed-operators": 2
示例:
// BAD
var foo = a && b < 0 || c > 0 || d + 1 === 0;
var foo = a + b * c;
// GOOD
var foo = a || b || c;
var foo = a && b && c;
var foo = (a && b < 0) || c > 0 || d + 1 === 0;
var foo = a && (b < 0 || c > 0 || d + 1 === 0);
var foo = a + (b * c);
var foo = (a + b) * c;
禁止空格和 tab 的混合缩进
"no-mixed-spaces-and-tabs": 2
禁止使用嵌套的三元表达式
"no-nested-ternary": 2
示例:
// BAD
var thing = foo ? bar : baz === qux ? quxx : foobar;
foo ? baz === qux ? quxx() : foobar() : bar();
// GOOD
var thing = foo ? bar : foobar;
var thing;
if (foo) {
thing = bar;
} else if (baz === qux) {
thing = quxx;
} else {
thing = foobar;
}
禁用 Object 的构造函数
"no-new-object": 2
示例:
// BAD
var myObject = new Object();
var myObject = new Object;
// GOOD
var myObject = new CustomObject();
var myObject = {};
禁用 tab
"no-tabs": 1
禁止可以表达为更简单结构的三元操作符
"no-unneeded-ternary": 1
示例:
// Bad
var isYes = answer === 1 ? true : false;
// Good
var isYes = answer === 1;
// Bad
var isNo = answer === 1 ? false : true;
// Good
var isNo = answer !== 1;
禁止属性前有空白
"no-whitespace-before-property": 1
示例:
// BAD
foo [bar]
foo. bar
foo .bar
foo. bar. baz
foo. bar()
.baz()
foo
.bar(). baz()
// GOOD
foo.bar
foo[bar]
foo[ bar ]
foo.bar.baz
foo
.bar().baz()
foo
.bar()
.baz()
foo.
bar().
baz()
强制单个语句的位置,禁止单行语句之前有换行
"nonblock-statement-body-position": [2, "beside"]
示例:
// BAD
if (foo)
bar();
else
baz();
while (foo)
bar();
for (let i = 1; i < foo; i++)
bar();
do
bar();
while (foo)
// GOOD
if (foo) bar();
else baz();
while (foo) bar();
for (let i = 1; i < foo; i++) bar();
do bar(); while (foo)
if (foo) { // block statements are always allowed with this rule
bar();
} else {
baz();
}
强制在花括号中使用一致的空格
"object-curly-spacing": [2, "always"]
示例:
// BAD
var obj = {'foo': 'bar'};
var obj = {'foo': 'bar' };
var obj = { baz: {'foo': 'qux'}, bar};
var obj = {baz: { 'foo': 'qux' }, bar};
var obj = {'foo': 'bar'
};
var obj = {
'foo':'bar'};
var {x} = y;
import {foo } from 'bar';
// GOOD
var obj = {};
var obj = { 'foo': 'bar' };
var obj = { 'foo': { 'bar': 'baz' }, 'qux': 'quxx' };
var obj = {
'foo': 'bar'
};
var { x } = y;
import { foo } from 'bar';
每个作用域允许出现多个变量声明,但对连续的变量声明要求合并为单个声明
"one-var": [2, "consecutive"]
示例:
// BAD
function foo() {
var bar;
var baz;
}
function foo(){
var bar = 1;
var baz = 2;
qux();
var qux = 3;
var quux;
}
// GOOD
function foo() {
var bar,
baz;
}
function foo(){
var bar = 1,
baz = 2;
qux();
var qux = 3,
quux;
}
要求在变量声明周围换行
"one-var-declaration-per-line": [2, "initializations"]
好的做法:
// "initializations" 强制每个变量初始化语句换行
var a, b;
let a,
b;
let a,
b = 0;
要求尽可能地简化赋值操作
"operator-assignment": [2, "always"]
示例:
// BAD
x = x + y;
x = y * x;
x[0] = x[0] / y;
x.y = x.y << z;
// GOOD
x = y;
x += y;
x = y * z;
x = (x * y) * z;
x[0] /= y;
x[foo()] = x[foo()] % 2;
x = y + x; // `+` is not always commutative (e.g. x = "abc")
强制操作符在换行的行前
"operator-linebreak": [2, "before"]
示例:
// BAD
foo = 1 +
2;
foo =
5;
if (someCondition ||
otherCondition) {
}
answer = everything ?
42 :
foo;
// GOOD
foo = 1 + 2;
foo = 1
+ 2;
foo
= 5;
if (someCondition
|| otherCondition) {
}
answer = everything
? 42
: foo;
禁止分号前有空格
"semi-spacing": [2, { "before": false }]
分号必须在行尾
"semi-style": [2, "last"]
好的做法:
foo();
[1, 2, 3].forEach(bar)
for (
var i = 0;
i < 10;
++i
) {
foo()
}
要求语句块之前的空格,即大括号前必须有空格
"space-before-blocks": 2
示例:
// BAD
if (a){
b();
}
function a(){}
for (;;){
b();
}
try {} catch(a){}
class Foo{
constructor(){}
}
// GOOD
if (a) {
b();
}
if (a) {
b();
} else {
c();
}
function a() {}
for (;;) {
b();
}
try {} catch(a) {}
要求函数圆括号之前有一个空格
"space-before-function-paren": [2, "always"]
好的做法:
function foo () {
// ...
}
var bar = function () {
// ...
};
var bar = function foo () {
// ...
};
class Foo {
constructor () {
// ...
}
}
var foo = {
bar () {
// ...
}
};
var foo = async () => 1
要求中缀操作符周围有空格
"space-infix-ops": 2
好的做法:
a + b
a ? b : c
const a = {b:1};
var {a = 0} = bar;
function foo(a = 0) { }
new、delete、typeof、void、yield 前后要有空格
"space-unary-ops": [2, {
"words": true,
"nonwords": false,
}]
好的做法:
// new
var joe = new Person();
// delete
var obj = {
foo: 'bar'
};
delete obj.foo;
// typeof
typeof {} // object
// void
void 0 // undefined
要求在注释前有空白(空格)
"spaced-comment": [2, "always"]
好的做法
/* eslint spaced-comment: ["error", "always"] */
// This is a comment with a whitespace at the beginning
/* This is a comment with a whitespace at the beginning */
/*
* This is a comment with a whitespace at the beginning
*/
/*
This comment has a newline
*/
强制在 switch 的冒号右侧有空格
"switch-colon-spacing": [2, {"after": true, "before": false}]
要求在模板标记和它们的字面量之间有空格
"template-tag-spacing": [2, "always"]
好的做法:
switch (a) {
case 0: foo(); break;
case 1:
bar();
break;
default:
baz();
break;
}
要求箭头函数的箭头之前或之后有空格
"arrow-spacing": [2, { "before": true, "after": true }]
好的做法:
() => {};
(a) => {};
a => a;
() => {'\n'};
强制 generator 函数中 * 号周围有空格
"generator-star-spacing": [1, "both"]
好的做法:
function * generator() {}
var anonymous = function * () {};
var shorthand = { * generator() {} };
扩展运算符及其表达式之间不允许有空格
"rest-spread-spacing": 1
示范:
// BAD
fn(... args)
[... arr, 4, 5, 6]
// GOOD
fn(...args)
[...arr, 4, 5, 6]
要求模板字符串中的嵌入表达式周围有空格,即 ${ vars }
"template-curly-spacing": ["error", "always"]
示范:
// BAD
`hello, ${ people.name}!`;
`hello, ${people.name }!`;
`hello, ${people.name}!`;
// GOOD
`hello, ${ people.name }!`;
`hello, ${
people.name
}!`;
强制在 yield* 表达式中 * 周围使用空格
"yield-star-spacing": ["error", "both"]
好的做法:
function * generator() {
yield * other();
}