Skip to content
← Back to rules

eslint/yoda スタイル

An auto-fix is available for this rule.

何をするか

「ヨーダ条件」の使用を許可するか禁止するかを指定します。 このルールは、変数とリテラル値を比較する条件のスタイルを一貫性を持たせる目的です。

なぜ問題なのか

「ヨーダ条件」と呼ばれるのは、比較の左辺にリテラル値が来て、右辺に変数が来る形式だからです。たとえば、以下はヨーダ条件です:

js
if ("red" === color) {
}

これは、星の戦士のキャラクター・ヨーダのように話すことに由来します。例えるなら、「赤は色に等しい」と読みます。逆に、通常の順序で書くと:

js
if (color === "red") {
  // ...
}

こちらは、「色が赤に等しい」と自然に読めます。これは、比較を記述する上でより直感的な表現と言えます。 ヨーダ条件を支持する立場では、=(代入)と ==(比較)を間違えることが不可能である点を挙げます。リテラル値に代入することはできないため、そのような誤りは構文エラーとなり、早期に発見されるからです。この習慣は、ツールがまだ十分に整備されていなかった初期のプログラミング時代には広く使われていました。 一方、反対側の立場では、現代のツール(たとえば ESLint)により、=== に誤って使った場合もすぐに検出できるようになっているため、ヨーダ条件の利点よりも可読性の低下というデメリットの方が大きいと主張しています。

never

デフォルトの "never" オプションに対して 不正な コードの例:

js
if ("red" === color) {
  // ...
}
if (`red` === color) {
  // ...
}
if (`red` === `${color}`) {
  // ...
}

if (true == flag) {
  // ...
}

if (0 <= x && x < 1) {
  // ...
}

デフォルトの "never" オプションに対して 正しい コードの例:

js
if (5 & value) {
  // ...
}

if (value === "red") {
  // ...
}

if (value === `red`) {
  // ...
}

if (`${value}` === `red`) {
}

exceptRange

"never", { "exceptRange": true } オプションに対して 正しい コードの例:

js
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 } オプションに対して 正しい コードの例:

js
if (x < -1 || 9 < x) {
}

if (x !== "foo" && "bar" != x) {
}

if (x !== `foo` && `bar` != x) {
}

always

"always" オプションに対して 不正な コードの例:

js
if (color == "blue") {
  // ...
}

if (color == `blue`) {
  // ...
}

"always" オプションに対して 正しい コードの例:

js
if ("blue" == value) {
  // ...
}

if (`blue` == value) {
  // ...
}

if (`blue` == `${value}`) {
  // ...
}

if (-1 < str.indexOf(substr)) {
  // ...
}

設定

1番目のオプション

type: "never" | "always"

"never"

デフォルトの "never" オプションは、オブジェクトリテラルを使って exceptRange および onlyEquality の例外設定を追加できます。

"always"

"always" オプションでは、比較においてリテラル値が常に最初に来ることを要求します。

2番目のオプション

このオプションは以下のプロパティを持つオブジェクトです。

exceptRange

type: boolean

default: false

"exceptRange" プロパティが true ならば、ルールは括弧で囲まれた範囲比較におけるヨーダ条件を 許可 します。ifwhile 条件の括弧内でも同様です。 「範囲比較」とは、変数が二つのリテラル値の間に含まれるかどうかを判定する比較のことです。

onlyEquality

type: boolean

default: false

"onlyEquality" プロパティが true ならば、ルールは等価演算子 == および === のみにヨーダ条件を報告します。 onlyEquality オプションは exceptRange が許可する例外のスーパーセットを許可するため、両方を同時に使用しても意味がありません。

使用方法

このルールを有効化するには、設定ファイルまたは CLI で次のように使用できます:

json
{
  "rules": {
    "yoda": "error"
  }
}
bash
oxlint --deny yoda

参照