yoda
Требовать или запрещать условия «Йоды»
Некоторые проблемы, о которых сообщает это правило, можно автоматически исправить с помощью параметра командной строки --fix
В настоящее время это правило заморожено, и запросы на добавление функций не принимаются.
Условия Йоды названы так потому, что сначала указывается литеральное значение условия, а затем переменная. Например, следующий код содержит условие Йоды:
if ("red" === color) {
// ...
}
Это называется условием Йоды, потому что его можно прочитать как «если красный равен цвету» — подобно тому, как говорит персонаж «Звёздных войн» Йода. Сравните с другим порядком операндов:
if (color === "red") {
// ...
}
Обычно это читается как «если цвет равен красному», что, пожалуй, является более естественным способом описать сравнение.
Сторонники условий Йоды отмечают, что невозможно случайно использовать = вместо ==, поскольку нельзя присвоить значение литералу. Это вызовет синтаксическую ошибку, и вы сразу узнаете о ней. Поэтому такая практика была очень распространена на заре программирования, когда подходящие инструменты ещё не были доступны.
Противники условий Йоды указывают на то, что инструменты сделали нас лучшими программистами: они обнаружат ошибочное использование = вместо == (ESLint сделает это за вас). Поэтому, утверждают они, польза этого шаблона не компенсирует ухудшение читаемости кода при использовании условий Йоды.
Подробное описание правила
Это правило призвано обеспечить единообразный стиль условий, в которых переменная сравнивается с литеральным значением.
Параметры
Правило может принимать строковый параметр:
- Если используется значение по умолчанию
"never", сравнения не должны быть условиями Йоды. - Если используется
"always", литеральное значение должно всегда указываться первым.
Для параметра по умолчанию "never" можно задать исключения в объектном литерале:
- Если свойство
"exceptRange"имеет значениеtrue, правило разрешает условия Йоды в сравнениях диапазонов, непосредственно заключённых в скобки, включая скобки условияifилиwhile. Значение по умолчанию —false. Сравнение диапазона проверяет, находится ли переменная внутри или за пределами диапазона между двумя литеральными значениями. - Если свойство
"onlyEquality"имеет значениеtrue, правило сообщает об условиях Йоды только для операторов равенства==и===. Значение по умолчанию —false.
Параметр onlyEquality допускает все исключения, разрешённые параметром exceptRange, а также дополнительные, поэтому использовать оба параметра одновременно нет смысла.
never
Примеры неправильного кода для параметра по умолчанию "never":
/*eslint yoda: "error"*/
if () {
// ...
}
if () {
// ...
}
if () {
// ...
}
if () {
// ...
}
if () {
// ...
}
if () {
// ...
}
if ( && x < 1) {
// ...
}
Примеры правильного кода для параметра по умолчанию "never":
/*eslint yoda: "error"*/
if (5 & value) {
// ...
}
if (value === "red") {
// ...
}
if (value === `red`) {
// ...
}
if (`${value}` === `red`) {
}
exceptRange
Примеры правильного кода для параметров "never", { "exceptRange": true }:
/*eslint yoda: ["error", "never", { "exceptRange": true }]*/
function isReddish(color) {
return (color.hue < 60 || 300 < color.hue);
}
if (x < -1 || 1 < x) {
// ...
}
if (count < 10 && (0 <= rand && rand < 1)) {
// ...
}
if (`blue` < x && x < `green`) {
// ...
}
function howLong(arr) {
return (0 <= arr.length && arr.length < 10) ? "short" : "long";
}
onlyEquality
Примеры правильного кода для параметров "never", { "onlyEquality": true }:
/*eslint yoda: ["error", "never", { "onlyEquality": true }]*/
if (x < -1 || 9 < x) {
}
if (x !== 'foo' && 'bar' != x) {
}
if (x !== `foo` && `bar` != x) {
}
always
Примеры неправильного кода для параметра "always":
/*eslint yoda: ["error", "always"]*/
if () {
// ...
}
if () {
// ...
}
Примеры правильного кода для параметра "always":
/*eslint yoda: ["error", "always"]*/
if ("blue" == value) {
// ...
}
if (`blue` == value) {
// ...
}
if (`blue` == `${value}`) {
// ...
}
if (-1 < str.indexOf(substr)) {
// ...
}
Версия
Это правило добавлено в ESLint v0.7.1.
Дополнительная литература
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/yoda