版本

use-isnan

當檢查 NaN 時,要求呼叫 isNaN()

建議

設定檔中使用來自 @eslint/jsrecommended 設定會啟用此規則

💡 有建議

此規則回報的一些問題可以透過編輯器的建議手動修正

在 JavaScript 中,NaNNumber 類型的特殊值。它用於表示由 IEEE 二進位浮點算術標準指定的雙精度 64 位元格式所表示的任何「非數字」值。

因為 NaN 在 JavaScript 中是獨一無二的,它不等於任何值,包括它自己,所以與 NaN 比較的結果令人困惑

  • NaN === NaNNaN == NaN 的結果為 false
  • NaN !== NaNNaN != NaN 的結果為 true

因此,請使用 Number.isNaN() 或全域 isNaN() 函式來測試值是否為 NaN

規則詳情

此規則不允許與 NaN 進行比較。

此規則的 錯誤 程式碼範例

在 Playground 中開啟
/*eslint use-isnan: "error"*/

if (foo == NaN) {
    // ...
}

if (foo != NaN) {
    // ...
}

if (foo == Number.NaN) {
    // ...
}

if (foo != Number.NaN) {
    // ...
}

此規則的 正確 程式碼範例

在 Playground 中開啟
/*eslint use-isnan: "error"*/

if (isNaN(foo)) {
    // ...
}

if (!isNaN(foo)) {
    // ...
}

選項

此規則有一個物件選項,包含兩個選項

  • "enforceForSwitchCase": true (預設) 額外不允許在 switch 語句中使用 case NaNswitch(NaN)
  • "enforceForIndexOf": true 額外不允許將 indexOflastIndexOf 方法與 NaN 一起使用。預設值為 false,表示此規則預設不會警告關於 indexOf(NaN)lastIndexOf(NaN) 方法呼叫。

enforceForSwitchCase

switch 語句在內部使用 === 比較,將運算式的值與 case 子句匹配。因此,它永遠無法匹配 case NaN。此外,switch(NaN) 也永遠無法匹配 case 子句。

"enforceForSwitchCase" 選項設定為 true (預設) 時,此規則的 錯誤 程式碼範例

在 Playground 中開啟
/*eslint use-isnan: ["error", {"enforceForSwitchCase": true}]*/

switch (foo) {
    case NaN:
        bar();
        break;
    case 1:
        baz();
        break;
    // ...
}

switch (NaN) {
    case a:
        bar();
        break;
    case b:
        baz();
        break;
    // ...
}

switch (foo) {
    case Number.NaN:
        bar();
        break;
    case 1:
        baz();
        break;
    // ...
}

switch (Number.NaN) {
    case a:
        bar();
        break;
    case b:
        baz();
        break;
    // ...
}

"enforceForSwitchCase" 選項設定為 true (預設) 時,此規則的 正確 程式碼範例

在 Playground 中開啟
/*eslint use-isnan: ["error", {"enforceForSwitchCase": true}]*/

if (Number.isNaN(foo)) {
    bar();
} else {
    switch (foo) {
        case 1:
            baz();
            break;
        // ...
    }
}

if (Number.isNaN(a)) {
    bar();
} else if (Number.isNaN(b)) {
    baz();
} // ...

"enforceForSwitchCase" 選項設定為 false 時,此規則的 正確 程式碼範例

在 Playground 中開啟
/*eslint use-isnan: ["error", {"enforceForSwitchCase": false}]*/

switch (foo) {
    case NaN:
        bar();
        break;
    case 1:
        baz();
        break;
    // ...
}

switch (NaN) {
    case a:
        bar();
        break;
    case b:
        baz();
        break;
    // ...
}

switch (foo) {
    case Number.NaN:
        bar();
        break;
    case 1:
        baz();
        break;
    // ...
}

switch (Number.NaN) {
    case a:
        bar();
        break;
    case b:
        baz();
        break;
    // ...
}

enforceForIndexOf

以下方法在內部使用 === 比較,將給定的值與陣列元素匹配

因此,對於任何陣列 foofoo.indexOf(NaN)foo.lastIndexOf(NaN) 將始終返回 -1

如果您希望此規則報告 indexOf(NaN)lastIndexOf(NaN) 方法呼叫,請將 "enforceForIndexOf" 設定為 true

"enforceForIndexOf" 選項設定為 true 時,此規則的 錯誤 程式碼範例

在 Playground 中開啟
/*eslint use-isnan: ["error", {"enforceForIndexOf": true}]*/

const hasNaN = myArray.indexOf(NaN) >= 0;

const firstIndex = myArray.indexOf(NaN);

const lastIndex = myArray.lastIndexOf(NaN);

const indexWithSequenceExpression = myArray.indexOf((doStuff(), NaN));

const firstIndexFromSecondElement = myArray.indexOf(NaN, 1);

const lastIndexFromSecondElement = myArray.lastIndexOf(NaN, 1);

"enforceForIndexOf" 選項設定為 true 時,此規則的 正確 程式碼範例

在 Playground 中開啟
/*eslint use-isnan: ["error", {"enforceForIndexOf": true}]*/

function myIsNaN(val) {
    return typeof val === "number" && isNaN(val);
}

function indexOfNaN(arr) {
    for (let i = 0; i < arr.length; i++) {
        if (myIsNaN(arr[i])) {
            return i;
        }
    }
    return -1;
}

function lastIndexOfNaN(arr) {
    for (let i = arr.length - 1; i >= 0; i--) {
        if (myIsNaN(arr[i])) {
            return i;
        }
    }
    return -1;
}

const hasNaN = myArray.some(myIsNaN);

const hasNaN1 = indexOfNaN(myArray) >= 0;

const firstIndex = indexOfNaN(myArray);

const lastIndex = lastIndexOfNaN(myArray);

// ES2015
const hasNaN2 = myArray.some(Number.isNaN);

// ES2015
const firstIndex1 = myArray.findIndex(Number.isNaN);

// ES2016
const hasNaN3 = myArray.includes(NaN);

已知限制

此選項檢查具有給定名稱的方法,即使 具有該方法的物件不是 陣列。

版本

此規則在 ESLint v0.0.6 中引入。

資源

變更語言