版本

yoda

要求或禁止“Yoda”条件

🔧 可修复

此规则报告的一些问题可以通过 --fix 命令行选项自动修复。

Yoda 条件之所以如此命名,是因为条件的字面值位于首位,而变量位于第二位。例如,以下是一个 Yoda 条件

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

这被称为 Yoda 条件,因为它读起来像“如果红色等于颜色”,类似于星球大战角色尤达的说话方式。与另一种排列操作数的方式进行比较

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

这通常读作“如果颜色等于红色”,这可以说是一种更自然的描述比较的方式。

Yoda 条件的支持者强调,不可能错误地使用 = 代替 ==,因为您无法为字面值赋值。这样做会导致语法错误,并且您会尽早收到错误信息。因此,这种实践在早期的编程中非常普遍,当时还没有可用的工具。

Yoda 条件的反对者指出,工具使我们成为了更好的程序员,因为工具会捕获错误使用 = 代替 == 的情况(ESLint 会为您捕获这种情况)。因此,他们认为,这种模式的实用性并不超过使用 Yoda 条件时代码的可读性损失。

规则详情

此规则旨在强制执行比较变量与字面值的条件的一致风格。

选项

此规则可以接受一个字符串选项

  • 如果它是默认的 "never",则比较永远不能是 Yoda 条件。
  • 如果它是 "always",则字面值必须始终放在首位。

默认的 "never" 选项可以在对象文字中包含异常选项

  • 如果 "exceptRange" 属性为 true,则该规则允许在直接用括号括起来的范围比较中使用 Yoda 条件,包括 ifwhile 条件的括号。默认值为 false范围比较测试变量是否在两个字面值之间的范围内。
  • 如果 "onlyEquality" 属性为 true,则该规则仅针对相等运算符 ===== 报告 Yoda 条件。默认值为 false

onlyEquality 选项允许 exceptRange 允许的异常的超集,因此这两个选项一起使用没有意义。

从不

对于默认的 "never" 选项,不正确代码的示例

在 Playground 中打开
/*eslint yoda: "error"*/

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

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

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

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

if (5 > count) {
    // ...
}

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

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

对于默认的 "never" 选项,正确代码的示例

在 Playground 中打开
/*eslint yoda: "error"*/

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

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

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

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

}

除了范围

对于 "never", { "exceptRange": true } 选项,正确代码的示例

在 Playground 中打开
/*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";
}

仅相等

对于 "never", { "onlyEquality": true } 选项,正确代码的示例

在 Playground 中打开
/*eslint yoda: ["error", "never", { "onlyEquality": true }]*/

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

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

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

总是

对于 "always" 选项,不正确代码的示例

在 Playground 中打开
/*eslint yoda: ["error", "always"]*/

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

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

对于 "always" 选项,正确代码的示例

在 Playground 中打开
/*eslint yoda: ["error", "always"]*/

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

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

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

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

版本

此规则是在 ESLint v0.7.1 中引入的。

进一步阅读

资源

更改语言