# no-magic-numbers
禁止幻数
'Magic numbers' 是在代码中多次出现但没有明确含义的数字。最好用命名常量替换它们。
var now = Date.now(),
inOneHour = now + (60 * 60 * 1000);
# 规则详情
no-magic-numbers
规则旨在通过确保将特殊数字声明为常量以使其含义明确,从而使代码更具可读性和重构更容易。
此规则的错误代码示例:
/*eslint no-magic-numbers: "error"*/
var dutyFreePrice = 100,
finalPrice = dutyFreePrice + (dutyFreePrice * 0.25);
/*eslint no-magic-numbers: "error"*/
var data = ['foo', 'bar', 'baz'];
var dataLast = data[2];
/*eslint no-magic-numbers: "error"*/
var SECONDS;
SECONDS = 60;
此规则的正确代码示例:
/*eslint no-magic-numbers: "error"*/
var TAX = 0.25;
var dutyFreePrice = 100,
finalPrice = dutyFreePrice + (dutyFreePrice * TAX);
# 选项
# ignore
要忽略的数字数组。默认设置为 []
。如果提供,它必须是 Array
。
该数组可以包含 number
和 string
类型的值。如果是字符串,则必须将文本解析为 bigint
字面(例如 "100n"
)。
示例 { "ignore": [1] }
选项的正确代码示例:
/*eslint no-magic-numbers: ["error", { "ignore": [1] }]*/
var data = ['foo', 'bar', 'baz'];
var dataLast = data.length && data[data.length - 1];
示例 { "ignore": ["1n"] }
选项的正确代码示例:
/*eslint no-magic-numbers: ["error", { "ignore": ["1n"] }]*/
foo(1n);
# ignoreArrayIndexes
一个布尔值,用于指定在数组索引的上下文中使用的数字(例如 data[2]
)是否被认为是可以的。默认为 false
。
此选项仅允许有效的数组索引:将被强制为 "0"
、"1"
、"2"
... 之一的数字"4294967294"
。
数组是对象,因此它们可以具有属性名称,例如 "-1"
或 "2.5"
。但是,这些只是不代表数组元素的 "normal" 对象属性。它们不会影响数组的 length
,并且会被 .map
或 .forEach
等数组方法忽略。
此外,由于 数组长度
的最大值为 232 - 1,所有高于 232 - 2 的值也仅代表普通属性名称,因此不被视为数组索引。
{ "ignoreArrayIndexes": true }
选项的正确代码示例:
/*eslint no-magic-numbers: ["error", { "ignoreArrayIndexes": true }]*/
var item = data[2];
data[100] = a;
f(data[0]);
a = data[-0]; // same as data[0], -0 will be coerced to "0"
a = data[0xAB];
a = data[5.6e1];
a = data[10n]; // same as data[10], 10n will be coerced to "10"
a = data[4294967294]; // max array index
{ "ignoreArrayIndexes": true }
选项的错误代码示例:
/*eslint no-magic-numbers: ["error", { "ignoreArrayIndexes": true }]*/
f(2); // not used as array index
a = data[-1];
a = data[2.5];
a = data[5.67e1];
a = data[-10n];
a = data[4294967295]; // above the max array index
a = data[1e500]; // same as data["Infinity"]
# ignoreDefaultValues
一个布尔值,用于指定默认值分配中使用的数字是否被认为是可以的。默认为 false
。
{ "ignoreDefaultValues": true }
选项的正确代码示例:
/*eslint no-magic-numbers: ["error", { "ignoreDefaultValues": true }]*/
const { tax = 0.25 } = accountancy;
function mapParallel(concurrency = 3) { /***/ }
/*eslint no-magic-numbers: ["error", { "ignoreDefaultValues": true }]*/
let head;
[head = 100] = []
# enforceConst
一个布尔值,用于指定我们是否应该在数字的变量声明中检查 const 关键字。默认为 false
。
{ "enforceConst": true }
选项的错误代码示例:
/*eslint no-magic-numbers: ["error", { "enforceConst": true }]*/
var TAX = 0.25;
var dutyFreePrice = 100,
finalPrice = dutyFreePrice + (dutyFreePrice * TAX);
# detectObjects
一个布尔值,用于指定我们是否应该在设置对象属性时检测数字。默认为 false
。
{ "detectObjects": true }
选项的错误代码示例:
/*eslint no-magic-numbers: ["error", { "detectObjects": true }]*/
var magic = {
tax: 0.25
};
var dutyFreePrice = 100,
finalPrice = dutyFreePrice + (dutyFreePrice * magic.tax);
{ "detectObjects": true }
选项的正确代码示例:
/*eslint no-magic-numbers: ["error", { "detectObjects": true }]*/
var TAX = 0.25;
var magic = {
tax: TAX
};
var dutyFreePrice = 100,
finalPrice = dutyFreePrice + (dutyFreePrice * magic.tax);