版本

yoda

要求或禁止「尤達」條件

🔧 可修復

此規則報告的某些問題可使用 --fix 命令列 選項自動修復

尤達條件之所以如此命名,是因為條件的字面值在前,而變數在後。 例如,以下是一個尤達條件

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

這被稱為尤達條件,因為它的讀法是「如果紅色等於顏色」,類似於《星際大戰》角色尤達說話的方式。 與另一種排列運算元的方式相比

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

這通常讀作「如果顏色等於紅色」,這可以說是描述比較的更自然的方式。

尤達條件的支持者強調,不可能錯誤地使用 = 而不是 ==,因為您無法賦值給字面值。 這樣做會導致語法錯誤,並且您會提早得知錯誤。 因此,這種做法在早期工具還不可用的程式設計中非常普遍。

尤達條件的反對者指出,工具使我們成為更好的程式設計師,因為工具會發現錯誤地使用 = 而不是 ==(ESLint 會為您發現這一點)。 因此,他們認為,該模式的實用性不比使用尤達條件時程式碼的可讀性下降來得重要。

規則詳細資訊

此規則旨在強制執行將變數與字面值比較的條件的一致樣式。

選項

此規則可以接受一個字串選項

  • 如果它是預設的 "never",則比較永遠不能是尤達條件。
  • 如果它是 "always",則字面值必須永遠放在第一位。

預設的 "never" 選項可以在物件字面值中包含例外選項

  • 如果 "exceptRange" 屬性為 true,則規則 _允許_ 在直接包裝在括號中的範圍比較中使用尤達條件,包括 ifwhile 條件的括號。 預設值為 false。 _範圍_ 比較會測試變數是否在兩個字面值之間的範圍內或範圍外。
  • 如果 "onlyEquality" 屬性為 true,則規則 _僅_ 為等號運算子 ===== 回報尤達條件。 預設值為 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)) {
    // ...
}

版本

此規則是在 ESLint v0.7.1 中引入的。

延伸閱讀

資源

變更語言