Eslint 代码规则
eslint:recommended (eslint 推荐使用 - 以下只展示了部分规则)
强制在 getter 属性中出现一个 return 语句 (getter-return)
get 语法将对象属性绑定到一个函数,该函数在查找该属性时将被调用。<br />注意,每个 getter 都期望有返回值。
错误 代码示例:
/*eslint getter-return: "error"*/
p = {
get name() {
// no returns.
},
};
Object.defineProperty(p, "age", {
get: function () {
// no returns.
},
});
class P {
get name() {
// no returns.
}
}
正确 代码示例:
/*eslint getter-return: "error"*/
p = {
get name() {
return "nicholas";
},
};
Object.defineProperty(p, "age", {
get: function () {
return 18;
},
});
class P {
get name() {
return "nicholas";
}
}
禁止与 -0 进行比较 (no-compare-neg-zero)
该规则对试图与 -0 进行比较的代码发出警告,因为并不会达到预期。也就是说像 x === -0 的代码对于 +0 和 -0 都有效。作者可能想要用 Object.is(x, -0)。
错误 代码示例:
if (x ===-0) {
// doSomething()...}
正确的 代码示例:
if (x ===0) {
// doSomething()...}
if (Object.is(x, -0)) {
// doSomething()...}
禁用 debugger (no-debugger)
debugger 语句用于告诉 JavaScript 执行环境停止执行并在代码的当前位置启动调试器。产品代码不应该包含 debugger,因为它会导致浏览器停止执行代码并打开一个适当的调试器。
错误 代码示例:
/*eslint no-debugger: "error"*/
function isTruthy(x) {
debugger;
returnBoolean(x);
}
正确 代码示例:
/*eslint no-debugger: "error"*/
function isTruthy(x) {
returnBoolean(x); // set a breakpoint at this line}
禁止在 function 定义中出现重复的参数 (no-dupe-args)
如果在一个函数定义中出现多个同名的参数,后面出现的会覆盖前面出现的参数。重复的名称可能是一个打字错误。
错误 代码示例:
/*eslint no-dupe-args: "error"*/
function foo(a, b, a) {
console.log("value of the second a:", a);
}
var bar = function (a, b, a) {
console.log("value of the second a:", a);
};
正确 代码示例:
/*eslint no-dupe-args: "error"*/
function foo(a, b, c) {
console.log(a, b, c);
}
var bar = function (a, b, c) {
console.log(a, b, c);
};
禁止在对象字面量中出现重复的键 (no-dupe-keys)
后边的键值会覆盖前边的键值,这一般是一个书写错误。
错误 代码示例:
/*eslint no-dupe-keys: "error"*/
var foo = {
bar: "baz",
bar: "qux",
};
var foo = {
bar: "baz",
bar: "qux",
};
var foo = {
0x1: "baz",
1: "qux",
};
正确 代码示例:
/*eslint no-dupe-keys: "error"*/
var foo = {
bar: "baz",
quxx: "qux",
};
禁止重复 case 标签(no-duplicate-case)
如果一个 switch 语句中的 case 子句中出现重复的测试表达式,那么很有可能是某个程序员拷贝了一个 case 子句但忘记了修改测试表达式。
错误 代码示例:
/*eslint no-duplicate-case: "error"*/
var a =1,
one =1;
switch (a) {
case1:
break;
case2:
break;
case1: // duplicate test expression
break;
default:
break;}
switch (a) {
case one:
break;
case2:
break;
case one: // duplicate test expression
break;
default:
break;}
switch (a) {
case "1":
break;
case "2":
break;
case "1": // duplicate test expression
break;
default:
break;}
正确 代码示例:
/*eslint no-duplicate-case: "error"*/
var a =1,
one =1;
switch (a) {
case1:
break;
case2:
break;
case3:
break;
default:
break;}
switch (a) {
case one:
break;
case2:
break;
case3:
break;
default:
break;}
switch (a) {
case "1":
break;
case "2":
break;
case "3":
break;
default:
break;}
禁止空块语句 (no-empty)
空语句块,如果不是技术上的错误,通常是由于不完整的重构造成的。这会造成代码阅读上的困惑。
错误 代码示例:
/*eslint no-empty: "error"*/
if (foo) {
}
while (foo) {}
switch (foo) {
}
try {
doSomething();
} catch (ex) {
} finally {
}
正确 代码示例:
/*eslint no-empty: "error"*/
if (foo) {
// empty}
while (foo) {
/* empty */}
try {
doSomething();} catch (ex) {
// continue regardless of error}
try {
doSomething();} finally {
/* continue regardless of error */}
禁止对 catch 子句中的异常重新赋值 (no-ex-assign)
在 try 语句中的 catch 子句中,如果意外地(或故意地)给异常参数赋值,是不可能引用那个位置的错误的。
错误 代码示例:
/*eslint no-ex-assign: "error"*/
try {
// code} catch (e) {
e =10;}
正确 代码示例:
/*eslint no-ex-assign: "error"*/
try {
// code} catch (e) {
var foo =10;}
禁用稀疏数组(no-sparse-arrays)
稀疏数组包括很多空位置,经常是由于在数组字面量中使用多个逗号造成的,例如:
var items = [, ,];
在这个例子中,item 数组的 length 为 2,实际上,items[0] 或 items[1]并没有值。数组中只有逗号是有效的,再加上 length 被设置,没有实际的值被设置,这些情况让很多开发者对稀疏数组感到困惑。考虑下面的情况:
var colors = ["red", , "blue"];
在这个例子中,colors 数值的 length 是 3。但是否是开发者想让数组中间出现一个空元素?或者只是一个书写错误?稀疏数组的定义方式造成了很大的困惑,建议避免使用它们,除非你确定它们在你的代码中很有用。
错误 代码示例:
/*eslint no-sparse-arrays: "error"*/
var items = [,];
var colors = ["red", , "blue"];
正确 代码示例:
/*eslint no-sparse-arrays: "error"*/
var items = [];
var items = newArray(23);
// trailing comma (after the last element) is not a problemvar colors = [ "red", "blue", ];
禁止在 return、throw、continue 和 break 语句后出现不可达代码 (no-unreachable)
因为 return、throw、continue 和 break 语句无条件地退出代码块,其之后的任何语句都不会被执行。
错误 代码示例:
/*eslint no-unreachable: "error"*/
function foo() {
returntrue;
console.log("done");
}
function bar() {
thrownewError("Oops!");
console.log("done");
}
while (value) {
break;
console.log("done");
}
thrownewError("Oops!");
console.log("done");
function baz() {
if (Math.random() < 0.5) {
return;
} else {
thrownewError();
}
console.log("done");
}
for (;;) {}
console.log("done");
正确 代码示例,因为 JavaScript 函数和变量提升:
/*eslint no-unreachable: "error"*/
function foo() {
return bar();
function bar() {
return1;
}}
function bar() {
return x;
var x;}
switch (foo) {
case1:
break;
var x;}
要求调用 isNaN()检查 NaN (use-isnan)
在 JavaScript 中,NaN 是 Number 类型的一个特殊值。它被用来表示非数值,这里的数值是指在 IEEE 浮点数算术标准中定义的双精度64位格式的值。<br />因为在 JavaScript 中 NaN 独特之处在于它不等于任何值,包括它本身,与 NaN 进行比较的结果是令人困惑:
- NaN !== NaN or NaN != NaN evaluate to true
因此,使用 Number.isNaN() 或 全局的 isNaN() 函数来测试一个值是否是 NaN。
错误 代码示例:
/*eslint use-isnan: "error"*/
if (foo ==NaN) {
// ...}
if (foo !=NaN) {
// ...}
正确 代码示例:
/*eslint use-isnan: "error"*/
if (isNaN(foo)) {
// ...}
if (!isNaN(foo)) {
// ...}
强制 typeof 表达式与有效的字符串进行比较 (valid-typeof)
对于绝大多数用例而言,typeof 操作符的结果是以下字符串字面量中的一个:"undefined"、"object"、"boolean"、"number"、"string"、"function"、"symbol" 和 "bigint"。把 typeof 操作符的结果与其它字符串进行比较,通常是个书写错误。
错误 代码示例:
/*eslint valid-typeof: "error"*/
typeof foo === "strnig";
typeof foo == "undefimed";
typeof bar != "nunber";
typeof bar !== "fucntion";
正确 代码示例:
/*eslint valid-typeof: "error"*/
typeof foo === "string";
typeof bar == "undefined";
typeof foo === baz;
typeof bar === typeof qux;
禁止 case 语句落空 (no-fallthrough)
使用匹配 /falls?\s?through/i 的正则表达式的注释来表明落空是有意为之的,,被认为是一个最佳实际。
错误 代码示例:
/*eslint no-fallthrough: "error"*/
switch(foo) {
case1:
doSomething();
case2:
doSomething();}
正确 代码示例:
/*eslint no-fallthrough: "error"*/
switch(foo) {
case1:
doSomething();
break;
case2:
doSomething();}
function bar(foo) {
switch(foo) {
case1:
doSomething();
return;
case2:
doSomething();
}}
switch(foo) {
case1:
doSomething();
thrownewError("Boo!");
case2:
doSomething();}
switch(foo) {
case1:
case2:
doSomething();}
switch(foo) {
case1:
doSomething();
// falls through
case2:
doSomething();}
注意,在上面的例子中,最后的 case 语句,不会引起警告,因为没有可落空的语句了。
禁止重新声明变量 (no-redeclare)
在 JavaScript 中,使用 var 可以对同一个变量再次声明。这会使变量实际声明和定义的位置混乱不堪。
错误 代码示例:
/*eslint no-redeclare: "error"*/
var a = 3;
var a = 10;
正确 代码示例:
/*eslint no-redeclare: "error"*/
var a = 3;
// ...
a = 10;
禁止不必要的 catch 子句 (no-useless-catch)
只重新抛出原始错误的 catch 子句是冗余的,对程序的运行时行为没有影响。这些冗余子句可能会导致混乱和代码膨胀,所以最好不要使用这些不必要的 catch 子句。
错误 代码示例:
/*eslint no-useless-catch: "error"*/
try {
doSomethingThatMightThrow();
} catch (e) {
throw e;
}
try {
doSomethingThatMightThrow();
} catch (e) {
throw e;
} finally {
cleanUp();
}
正确 代码示例:
/*eslint no-useless-catch: "error"*/
try {
doSomethingThatMightThrow();
} catch (e) {
doSomethingBeforeRethrow();
throw e;
}
try {
doSomethingThatMightThrow();
} catch (e) {
handleError(e);
}
禁止删除变量 (no-delete-var)
delete 的目的是删除对象的属性。使用 delete 操作删除一个变量可能会导致意外情况发生。
错误 代码示例:
/*eslint no-delete-var: "error"*/
var x;
delete x;
禁止未使用过的变量 (no-unused-vars)
已声明的变量在代码里未被使用过,就像是由于不完整的重构而导致的遗漏错误。这样的变量增加了代码量,并且混淆读者。
错误 代码示例:
/*eslint no-unused-vars: "error"*/ /*global some_unused_var*/
// It checks variables you have defined as global
some_unused_var = 42;
var x;
// Write-only variables are not considered as used.
var y = 10;
y = 5;
// A read for a modification of itself is not considered as used.var z =0;
z = z + 1;
正确 代码示例:
/*eslint no-unused-vars: "error"*/
var x = 10;
alert(x);
拓展
要求使用点号 (dot-notation)
在 JavaScript 中,你可以使用点号 (foo.bar) 或者方括号 (foo["bar"])来访问属性。然而,点号通常是首选,因为它更加易读,简洁,也更适于 JavaScript 压缩。
错误 代码示例:
/*eslint dot-notation: "error"*/
var x = foo["bar"];
正确 代码示例:
/*eslint dot-notation: "error"*/
var x = foo.bar;
var x = foo[bar]; // Property name is a variable, square-bracket notation required
要求使用 === 和 !== (eqeqeq)
使用类型安全的 === 和 !== 操作符代替 == 和 != 操作符是一个很好的实践。这样做的原因是,== 和 != 遵循 Abstract Equality Comparison Algorithm 作强制转型。例如,以下语句被认为是 true。
- [] == false
- [] == ![]
- 3 == "03"
如果它们中的任何一个出现在一个看上去无害的语句中,比如 a == b ,那么实际的问题是很难被发现的。
### **禁止在 else 前有 return (no-else-return)**
如果 if 块中包含了一个 return 语句,else 块就成了多余的了。可以将其内容移至块外。
错误 代码示例:
/*eslint no-else-return: "error"*/
function foo() {
if (x) {
return y;
} else {
return z;
}
}
正确 代码示例:
/*eslint no-else-return: "error"*/
function foo() {
if (x) {
return y;
}
return z;
}
禁止出现空函数 (no-empty-function)
空函数能降低代码的可读性,因为读者需要猜测它是否是有意为之。所以,为空函数写一个清晰的注释是个很好的实践。
错误 代码示例:
/*eslint no-empty-function: "error"*/ /*eslint-env es6*/
function foo() {}
var foo = function () {};
var foo = () => {};
禁止多余的 return 语句 (no-useless-return)
return; 语句是多余的,并且在函数执行过程中不会产生效果。这可能令人困惑,因此最好禁止使用这些多余的语句。
错误 代码示例:
/* eslint no-useless-return: "error" */
function foo() { return; }
function foo() {
doSomething();
return;}
function foo() {
if (condition) {
bar();
return;
} else {
baz();
}}
function foo() {
switch (bar) {
case1:
doSomething();
default:
doSomethingElse();
return;
}}
正确 代码示例:
/* eslint no-useless-return: "error" */
function foo() {
return5;
}
function foo() {
return doSomething();
}
function foo() {
if (condition) {
bar();
return;
} else {
baz();
}
qux();
}
要求或者禁止 Yoda 条件 (yoda)
yoda 条件被如此命名,是因为在条件判断中字面量在先而变量在第二的位置。例如,以下是 Yoda 条件:
if ("red" === color) {
// ...}
它被叫做 Yoda 条件是因为它这样读:”红色是颜色”,类似于星球大战中 Yoda 的讲话方式。对比另一种操作数的排序方式:
if (color === "red") {
// ...}
这通常读作,”颜色是红的”,这是一种更自然的方式去描述对比。
不允许初始化变量值为 undefined (no-undef-init)
在 JavaScript 中,声明一个变量但未初始化,变量会自动获得 undefined 作为初始值。比如:
var foo;
console.log(foo === undefined); // true
因此,初始化变量值为 undefined 是多余的,如:
var foo = undefined;
最好的做法是避免初始化变量值为 undefined。
要求使用 let 或 const 而不是 var
错误 代码示例:
/*eslint no-var: "error"*/
var x = "y";
var CONFIG = {};
正确 代码示例:
/*eslint no-var: "error"*/ /*eslint-env es6*/
let x = "y";
const CONFIG = {};
建议使用剩余参数代替 arguments (prefer-rest-params)
ES2015 里有剩余参数。我们可以利用这个特性代替变参函数的 arguments 变量。<br />arguments 没有 Array.prototype 方法,所以有点不方便。
错误 的代码示例:
function foo() {
console.log(arguments);
}
function foo(action) {
var args = Array.prototype.slice.call(arguments, 1);
action.apply(null, args);
}
function foo(action) {
var args = [].slice.call(arguments, 1);
action.apply(null, args);
}
正确 的代码示例:
function foo(...args) {
console.log(args);}
function foo(action, ...args) {
action.apply(null, args); // or `action(...args)`, related to the `prefer-spread` rule.}
禁用 caller 或 callee (no-caller)
arguments.caller 和 arguments.callee 的使用使一些代码优化变得不可能。在 JavaScript 的新版本中它们已被弃用,同时在 ECMAScript 5 的严格模式下,它们也是被禁用的。
错误 代码示例:
/*eslint no-caller: "error"*/
function foo(n) {
if (n <= 0) {
return;
}
arguments.callee(n - 1);
}
[1, 2, 3, 4, 5].map(function (n) {
return !(n > 1) ? 1 : arguments.callee(n - 1) * n;
});
正确 代码示例:
/*eslint no-caller: "error"*/
function foo(n) {
if (n <= 0) {
return;
}
foo(n - 1);
}
[1, 2, 3, 4, 5].map(function factorial(n) {
return !(n > 1) ? 1 : factorial(n - 1) * n;
});