
yoda
要求或禁止「尤達」條件
🔧 可修復
此規則報告的某些問題可使用 --fix
命令列 選項自動修復
尤達條件之所以如此命名,是因為條件的字面值在前,而變數在後。 例如,以下是一個尤達條件
if ("red" === color) {
// ...
}
這被稱為尤達條件,因為它的讀法是「如果紅色等於顏色」,類似於《星際大戰》角色尤達說話的方式。 與另一種排列運算元的方式相比
if (color === "red") {
// ...
}
這通常讀作「如果顏色等於紅色」,這可以說是描述比較的更自然的方式。
尤達條件的支持者強調,不可能錯誤地使用 =
而不是 ==
,因為您無法賦值給字面值。 這樣做會導致語法錯誤,並且您會提早得知錯誤。 因此,這種做法在早期工具還不可用的程式設計中非常普遍。
尤達條件的反對者指出,工具使我們成為更好的程式設計師,因為工具會發現錯誤地使用 =
而不是 ==
(ESLint 會為您發現這一點)。 因此,他們認為,該模式的實用性不比使用尤達條件時程式碼的可讀性下降來得重要。
規則詳細資訊
此規則旨在強制執行將變數與字面值比較的條件的一致樣式。
選項
此規則可以接受一個字串選項
- 如果它是預設的
"never"
,則比較永遠不能是尤達條件。 - 如果它是
"always"
,則字面值必須永遠放在第一位。
預設的 "never"
選項可以在物件字面值中包含例外選項
- 如果
"exceptRange"
屬性為true
,則規則 _允許_ 在直接包裝在括號中的範圍比較中使用尤達條件,包括if
或while
條件的括號。 預設值為false
。 _範圍_ 比較會測試變數是否在兩個字面值之間的範圍內或範圍外。 - 如果
"onlyEquality"
屬性為true
,則規則 _僅_ 為等號運算子==
和===
回報尤達條件。 預設值為false
。
onlyEquality
選項允許 exceptRange
允許的例外情況的超集,因此這兩個選項一起使用沒有意義。
never
預設 "never"
選項的 不正確 程式碼範例
在遊樂場中開啟
/*eslint yoda: "error"*/
if () {
// ...
}
if () {
// ...
}
if () {
// ...
}
if () {
// ...
}
if () {
// ...
}
if () {
// ...
}
if ( && 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 () {
// ...
}
if () {
// ...
}
"always"
選項的 正確 程式碼範例
在遊樂場中開啟
/*eslint yoda: ["error", "always"]*/
if ("blue" == value) {
// ...
}
if (`blue` == value) {
// ...
}
if (`blue` == `${value}`) {
// ...
}
if (-1 < str.indexOf(substr)) {
// ...
}
版本
此規則是在 ESLint v0.7.1 中引入的。
延伸閱讀
