# yoda

要求或禁止 "Yoda" 条件

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

尤达条件之所以如此命名,是因为条件的字面值排在第一位,而变量排在第二位。例如,以下是 Yoda 条件:

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

这被称为尤达条件,因为它读作 "if red equals the color",类似于星球大战角色尤达说话的方式。与排列操作数的其他方式比较:

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

这通常读作 "if the color equals red",这可以说是描述比较的更自然的方式。

Yoda 条件的支持者强调不可能错误地使用 = 而不是 ==,因为您不能分配给字面值。这样做会导致语法错误,并且您会在早期被告知错误。因此,这种做法在工具尚不可用的早期编程中非常普遍。

Yoda 条件的反对者指出,工具使我们成为更好的程序员,因为工具会发现错误使用 = 而不是 ==(ESLint 会为你发现这一点)。因此,他们认为,该模式的实用性并没有超过使用 Yoda 条件时代码对可读性的影响。

# 规则详情

此规则旨在强制执行一致的条件样式,将变量与字面值进行比较。

# 选项

此规则可以采用字符串选项:

  • 如果是默认的 "never",那么比较绝对不能是 Yoda 条件。
  • 如果是 "always",那么字面量值必须始终排在第一位。

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

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

onlyEquality 选项允许 exceptRange 允许的异常的超集,因此这两个选项不能一起使用。

# never

默认 "never" 选项的错误代码示例:

/*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" 选项的正确代码示例:

/*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 (color == "blue") {
    // ...
}

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

"always" 选项的正确代码示例:

/*eslint yoda: ["error", "always"]*/

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

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

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

if (-1 < str.indexOf(substr)) {
    // ...
}
Last Updated: 5/13/2023, 8:55:38 PM