Skip to content
← Back to rules

eslint/yoda Style

🛠️ An auto-fix is available for this rule.

它的作用

要求或禁止 “Yoda” 条件。 此规则旨在强制变量与字面量值进行比较时的条件风格保持一致。

为什么这不好?

之所以称为 Yoda 条件,是因为条件中的字面量值排在前面,而变量排在后面。例如,下面就是一个 Yoda 条件:

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

之所以称其为 Yoda 条件,是因为它读起来像“如果红色等于颜色”,类似《星球大战》角色尤达的说话方式。再比较一下另一种安排操作数的方式:

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

这通常读起来像“如果颜色等于红色”,这无疑是一种更自然的比较描述方式。 Yoda 条件的支持者强调,错误地把 = 写成 == 是不可能的,因为你不能把值赋给字面量。这样做会导致语法错误,并且会让你尽早发现这个错误。因此,在早期编程中,由于当时还没有可用的工具,这种做法非常常见。 Yoda 条件的反对者指出,工具已经让我们成为更好的程序员,因为工具会捕获把 = 误写成 == 的错误(ESLint 会帮你检查出来)。因此,他们认为,这种模式带来的收益并不足以抵消使用 Yoda 条件时对可读性的影响。

示例

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" 选项可以在对象字面量中通过 exceptRangeonlyEquality 配置例外选项。

"always"

"always" 选项要求在比较中,字面量值必须始终放在前面。

第 2 个选项

此选项是一个包含以下属性的对象:

exceptRange

type: boolean

default: false

如果 "exceptRange" 属性为 true,则该规则允许 在直接用括号包裹的范围比较中使用 Yoda 条件,包括 ifwhile 条件的括号。 “范围”比较用于测试某个变量是否位于两个字面量值之间的范围内或范围外。

onlyEquality

type: boolean

default: false

如果 "onlyEquality" 属性为 true,则该规则仅对相等运算符 ===== 报告 Yoda 条件。onlyEquality 选项允许的例外是 exceptRange 允许的超集,因此这两个选项不适合一起使用。

如何使用

To enable this rule using the config file or in the CLI, you can use:

json
{
  "rules": {
    "yoda": "error"
  }
}
ts
import { defineConfig } from "oxlint";

export default defineConfig({
  rules: {
    "yoda": "error",
  },
});
bash
oxlint --deny yoda

版本

此规则在 v0.14.1 中加入。

参考资料