版本

yoda

要求或禁止「尤達」條件式

🔧 可修正

此規則回報的某些問題可以透過 --fix 命令列 選項自動修正

❄️ 凍結

此規則目前為凍結狀態,不接受功能請求。

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

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

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

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

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

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

尤達條件式的反對者指出,工具的出現使我們成為更好的程式設計師,因為工具會捕捉到錯誤使用 = 而不是 == 的情況(ESLint 會為您捕捉到這一點)。因此,他們認為,這種模式的實用性並不能彌補使用尤達條件式時程式碼可讀性降低的缺點。

規則詳情

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

選項

此規則可以接受字串選項

  • 如果它是預設的 "never",則比較絕不能是尤達條件式。
  • 如果它是 "always",則字面值必須始終在前。

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

  • 如果 "exceptRange" 屬性為 true,則此規則允許在範圍比較中使用尤達條件式,範圍比較直接包裝在括號中,包括 ifwhile 條件式的括號。預設值為 false範圍比較測試變數是否在兩個字面值之間的範圍內或範圍外。
  • 如果 "onlyEquality" 屬性為 true,則此規則針對等號運算子 ===== 回報尤達條件式。預設值為 false

onlyEquality 選項允許 exceptRange 允許的例外情況的超集合,因此這兩個選項一起使用沒有意義。

never

預設 "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`) {

}

exceptRange

"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";
}

onlyEquality

"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

"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 中引入。

延伸閱讀

資源

變更語言