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)) {
  // ...
}

配置

第一个选项

类型:"never" | "always"

"never"

默认的 "never" 选项可以包含对象字面量形式的例外配置项,通过 exceptRangeonlyEquality 实现。

"always"

"always" 选项要求所有比较中,字面量必须始终出现在前面。

第二个选项

该选项是一个具有以下属性的对象:

exceptRange

类型:boolean

默认值:false

如果 "exceptRange" 属性为 true,则规则允许在直接括号包裹的范围比较中使用“尤达”风格的条件表达式,包括 ifwhile 条件中的括号。所谓“范围”比较,是指测试某个变量是否在两个字面量之间的范围内。

onlyEquality

类型:boolean

默认值:false

如果 "onlyEquality" 属性为 true,则规则仅对相等运算符 ===== 报告“尤达”风格的条件表达式。onlyEquality 选项所允许的例外情况比 exceptRange 更广泛,因此这两个选项不宜同时使用。

如何使用

要通过配置文件或命令行启用此规则,可以使用:

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

参考资料