Spec-Zone.ru › ESLint

no-magic-numbers

Запрет на магические числа

«Магические числа» — это числа, которые встречаются несколько раз в коде без явного смысла. Их предпочтительно заменять именованными константами.

var now = Date.now(),
    inOneHour = now + (60 * 60 * 1000);

Подробное описание правила

Правило no-magic-numbers призвано сделать код более читаемым и упростить рефакторинг, гарантируя, что специальные числа объявляются как константы для явного указания их значения.

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint no-magic-numbers: "error"*/

var dutyFreePrice = 100,
    finalPrice = dutyFreePrice + (dutyFreePrice * 0.25);
Открыть в Playground
/*eslint no-magic-numbers: "error"*/

var data = ['foo', 'bar', 'baz'];

var dataLast = data[2];
Открыть в Playground
/*eslint no-magic-numbers: "error"*/

var SECONDS;

SECONDS = 60;

Примеры правильного кода для этого правила:

Открыть в Playground
/*eslint no-magic-numbers: "error"*/

var TAX = 0.25;

var dutyFreePrice = 100,
    finalPrice = dutyFreePrice + (dutyFreePrice * TAX);

Параметры

ignore

Массив чисел, которые нужно пропустить. По умолчанию установлено значение []. Если указан, он должен быть Array.

Массив может содержать значения типа number и string. Если это строка, текст должен быть распарсен как bigint литерал (например, "100n").

Примеры правильного кода для параметра { "ignore": [1] }:

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignore": [1] }]*/

var data = ['foo', 'bar', 'baz'];
var dataLast = data.length && data[data.length - 1];

Примеры правильного кода для параметра { "ignore": ["1n"] }:

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignore": ["1n"] }]*/

foo(1n);

ignoreArrayIndexes

Булево значение, указывающее, считаются ли числа, используемые в контексте индексов массива (например, data[2]), допустимыми. По умолчанию false.

Этот параметр допускает только корректные индексы массивов: числа, которые будут приведены к одному из "0", "1", "2" … "4294967294".

Массивы — это объекты, поэтому они могут иметь имена свойств, такие как "-1" или "2.5". Однако это просто «обычные» свойства объекта, которые не представляют элементы массива. Они не влияют на length массива и игнорируются методами массива, такими как .map или .forEach.

Кроме того, поскольку максимальная длина массива составляет 232 - 1, все значения выше 232 - 2 также представляют собой просто имена обычных свойств и, следовательно, не считаются индексами массива.

Примеры правильного кода для параметра { "ignoreArrayIndexes": true }:

Открыть в Playground
/*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 }:

Открыть в Playground
/*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 }:

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreDefaultValues": true }]*/

const { tax = 0.25 } = accountancy;

function mapParallel(concurrency = 3) { /***/ }
Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreDefaultValues": true }]*/

let head;
[head = 100] = []

ignoreClassFieldInitialValues

Булево значение, указывающее, считаются ли числа, используемые в качестве начальных значений полей класса, допустимыми. По умолчанию false.

Примеры правильного кода для параметра { "ignoreClassFieldInitialValues": true }:

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreClassFieldInitialValues": true }]*/

class C {
    foo = 2;
    bar = -3;
    #baz = 4;
    static qux = 5;
}

Примеры неправильного кода для параметра { "ignoreClassFieldInitialValues": true }:

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreClassFieldInitialValues": true }]*/

class C {
    foo = 2 + 3;
}

class D {
    2;
}

enforceConst

Булево значение, указывающее, следует ли проверять ключевое слово const при объявлении переменных чисел. По умолчанию false.

Примеры неправильного кода для параметра { "enforceConst": true }:

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "enforceConst": true }]*/

var TAX = 0.25;

var dutyFreePrice = 100,
    finalPrice = dutyFreePrice + (dutyFreePrice * TAX);

detectObjects

Булево значение, указывающее, следует ли обнаруживать числа при установке свойств объекта, например. По умолчанию false.

Примеры неправильного кода для параметра { "detectObjects": true }:

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "detectObjects": true }]*/

var magic = {
  tax: 0.25
};

var dutyFreePrice = 100,
    finalPrice = dutyFreePrice + (dutyFreePrice * magic.tax);

Примеры правильного кода для параметра { "detectObjects": true }:

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "detectObjects": true }]*/

var TAX = 0.25;

var magic = {
  tax: TAX
};

var dutyFreePrice = 100,
    finalPrice = dutyFreePrice + (dutyFreePrice * magic.tax);

Версия

Это правило было добавлено в ESLint v1.7.0.

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-magic-numbers

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API