prefer-const
建议使用const(prefer-const)
在命令行上的--fix
选项可以自动修复一些被这条规则反映的问题。
如果一个变量从不重新分配,使用const
声明更好。
const
声明告诉读者,“这个变量永远不会被重新分配,”减少认知负荷并提高可维护性。
规则细节
此规则旨在标记使用let
关键字声明的变量,但在初始分配后从未重新分配变量。
此规则的错误
代码示例:
/*eslint prefer-const: "error"*/
/*eslint-env es6*/
// it's initialized and never reassigned.
let a = 3;
console.log(a
let a;
a = 0;
console.log(a
// `i` is redefined (not reassigned) on each loop step.
for (let i in [1, 2, 3]) {
console.log(i
}
// `a` is redefined (not reassigned) on each loop step.
for (let a of [1, 2, 3]) {
console.log(a
}
此规则的正确
代码示例:
/*eslint prefer-const: "error"*/
/*eslint-env es6*/
// using const.
const a = 0;
// it's never initialized.
let a;
console.log(a
// it's reassigned after initialized.
let a;
a = 0;
a = 1;
console.log(a
// it's initialized in a different block from the declaration.
let a;
if (true) {
a = 0;
}
console.log(a
// it's initialized at a place that we cannot write a variable declaration.
let a;
if (true) a = 0;
console.log(a
// `i` gets a new binding each iteration
for (const i in [1, 2, 3]) {
console.log(i
}
// `a` gets a new binding each iteration
for (const a of [1, 2, 3]) {
console.log(a
}
// `end` is never reassigned, but we cannot separate the declarations without modifying the scope.
for (let i = 0, end = 10; i < end; ++i) {
console.log(a
}
// suggest to use `no-var` rule.
var b = 3;
console.log(b
选项
{
"prefer-const": ["error", {
"destructuring": "any",
"ignoreReadBeforeAssign": false
}]
}
解构
在解构中解决变量的方式。有2个值:
"any"
(默认) - 如果解构中的任何变量应该是const
,则此规则将警告这些变量。
"all"
- 如果解构中的所有变量应该是const
,则此规则会警告变量。否则,忽略它们。
不正确的
代码为默认{"destructuring": "any"}
选项的示例:
/*eslint prefer-const: "error"*/
/*eslint-env es6*/
let {a, b} = obj; /*error 'b' is never reassigned, use 'const' instead.*/
a = a + 1;
默认{"destructuring": "any"}
选项的正确
代码示例:
/*eslint prefer-const: "error"*/
/*eslint-env es6*/
// using const.
const {a: a0, b} = obj;
const a = a0 + 1;
// all variables are reassigned.
let {a, b} = obj;
a = a + 1;
b = b + 1;
{"destructuring": "all"}
选项的错误
代码示例:
/*eslint prefer-const: ["error", {"destructuring": "all"}]*/
/*eslint-env es6*/
// all of `a` and `b` should be const, so those are warned.
let {a, b} = obj; /*error 'a' is never reassigned, use 'const' instead.
'b' is never reassigned, use 'const' instead.*/
选项的正确
代码示例{"destructuring": "all"}
:
/*eslint prefer-const: ["error", {"destructuring": "all"}]*/
/*eslint-env es6*/
// 'b' is never reassigned, but all of `a` and `b` should not be const, so those are ignored.
let {a, b} = obj;
a = a + 1;
ignoreReadBeforeAssign
这是避免与no-use-before-define
规则冲突的选项(无"nofunc"
选项)。如果true
指定,则此规则将忽略在声明和第一个赋值之间读取的变量。默认是false
。
{"ignoreReadBeforeAssign": true}
选项的正确
代码示例:
/*eslint prefer-const: ["error", {"ignoreReadBeforeAssign": true}]*/
/*eslint-env es6*/
let timer;
function initialize() {
if (foo()) {
clearInterval(timer
}
}
timer = setInterval(initialize, 100
默认{"ignoreReadBeforeAssign": false}
选项的正确
代码示例:
/*eslint prefer-const: ["error", {"ignoreReadBeforeAssign": false}]*/
/*eslint-env es6*/
const timer = setInterval(initialize, 100
function initialize() {
if (foo()) {
clearInterval(timer
}
}
何时不使用它
如果您不想收到有关初始分配后永远不会重新分配的变量的通知,则可以安全地禁用此规则。
相关规则
- no-var
- no-use-before-define
版本
该规则在 ESLint 0.23.0中引入。