Йода
Требовать или запрещать условия «Йода»
Некоторые проблемы, обнаруженные этим правилом, могут быть автоматически исправлены с помощью опции командной строки --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