eslint/yoda 风格
它的作用
强制要求或禁止使用“尤达”风格的条件表达式。 该规则旨在统一变量与字面量比较时的条件表达式风格。
为什么这是个问题?
“尤达”风格的条件表达式之所以得名,是因为在表达式中,字面量位于前面,而变量位于后面。例如,以下就是一个“尤达”风格的条件:
if ("red" === color) {
}这种写法被称为“尤达”风格,因为它读起来像“如果红色等于颜色”,类似于《星球大战》角色尤达的说话方式。与此相对的是另一种操作数排列方式:
if (color === "red") {
// ...
}这通常读作“如果颜色等于红色”,被认为是一种更自然的描述比较的方式。 支持“尤达”风格的人指出,由于无法将赋值操作符 = 作用于字面量,因此不可能错误地使用 = 而不是 ==。这样做会引发语法错误,从而可以尽早发现错误。因此,在早期编程时代,这种做法非常普遍,因为当时尚无有效的工具辅助。 反对者则认为,现代工具已经使我们成为更好的程序员,因为工具能够捕获将 = 错误地用作 == 的情况(ESLint 会为你捕捉到这类错误)。因此,他们认为这种写法带来的可读性下降,远超过其潜在的好处。
示例
never
默认 "never" 选项下的 错误 代码示例:
if ("red" === color) {
// ...
}
if (`red` === color) {
// ...
}
if (`red` === `${color}`) {
// ...
}
if (true == flag) {
// ...
}
if (0 <= x && x < 1) {
// ...
}默认 "never" 选项下的 正确 代码示例:
if (5 & value) {
// ...
}
if (value === "red") {
// ...
}
if (value === `red`) {
// ...
}
if (`${value}` === `red`) {
}exceptRange
"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 } 选项下的 正确 代码示例:
if (x < -1 || 9 < x) {
}
if (x !== "foo" && "bar" != x) {
}
if (x !== `foo` && `bar` != x) {
}always
"always" 选项下的 错误 代码示例:
if (color == "blue") {
// ...
}
if (color == `blue`) {
// ...
}"always" 选项下的 正确 代码示例:
if ("blue" == value) {
// ...
}
if (`blue` == value) {
// ...
}
if (`blue` == `${value}`) {
// ...
}
if (-1 < str.indexOf(substr)) {
// ...
}配置
第一个选项
类型:"never" | "always"
"never"
默认的 "never" 选项可以包含对象字面量形式的例外配置项,通过 exceptRange 和 onlyEquality 实现。
"always"
"always" 选项要求所有比较中,字面量必须始终出现在前面。
第二个选项
该选项是一个具有以下属性的对象:
exceptRange
类型:boolean
默认值:false
如果 "exceptRange" 属性为 true,则规则允许在直接括号包裹的范围比较中使用“尤达”风格的条件表达式,包括 if 或 while 条件中的括号。所谓“范围”比较,是指测试某个变量是否在两个字面量之间的范围内。
onlyEquality
类型:boolean
默认值:false
如果 "onlyEquality" 属性为 true,则规则仅对相等运算符 == 和 === 报告“尤达”风格的条件表达式。onlyEquality 选项所允许的例外情况比 exceptRange 更广泛,因此这两个选项不宜同时使用。
如何使用
要通过配置文件或命令行启用此规则,可以使用:
{
"rules": {
"yoda": "error"
}
}oxlint --deny yoda