版本

use-isnan

在检查 NaN 时要求调用 isNaN()

推荐

配置文件 中使用 @eslint/js 中的 recommended 配置将启用此规则

💡 有建议

此规则报告的一些问题可以通过编辑器 建议 手动修复

在 JavaScript 中,NaNNumber 类型的一个特殊值。它用于表示 IEEE 标准为二进制浮点数算术所指定的双精度 64 位格式所表示的任何“非数字”值。

由于 NaN 在 JavaScript 中是独一无二的,因为它不等于任何东西,包括它本身,因此与 NaN 的比较结果令人困惑

  • NaN === NaNNaN == NaN 评估为 false
  • NaN !== NaNNaN != NaN 评估为 true

因此,使用 Number.isNaN() 或全局 isNaN() 函数来测试一个值是否为 NaN

规则详情

此规则禁止与 ‘NaN’ 的比较。

此规则的**不正确**代码示例

在游乐场中打开
/*eslint use-isnan: "error"*/

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

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

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

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

此规则的**正确**代码示例

在游乐场中打开
/*eslint use-isnan: "error"*/

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

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

选项

此规则有一个对象选项,包含两个选项

  • "enforceForSwitchCase": true(默认)此外还禁止 switch 语句中的 case NaNswitch(NaN)
  • "enforceForIndexOf": true 此外还禁止使用 NaNindexOflastIndexOf 方法。默认值为 false,这意味着此规则默认情况下不会警告 indexOf(NaN)lastIndexOf(NaN) 方法调用。

enforceForSwitchCase

switch 语句在内部使用 === 比较将表达式的值与 case 子句匹配。因此,它永远不会匹配 case NaN。此外,switch(NaN) 永远不会匹配 case 子句。

"enforceForSwitchCase" 选项设置为 true(默认)的此规则的**不正确**代码示例

在游乐场中打开
/*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(默认)的此规则的**正确**代码示例

在游乐场中打开
/*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 的此规则的**正确**代码示例

在游乐场中打开
/*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 的此规则的**不正确**代码示例

在游乐场中打开
/*eslint use-isnan: ["error", {"enforceForIndexOf": true}]*/

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

var firstIndex = myArray.indexOf(NaN);

var lastIndex = myArray.lastIndexOf(NaN);

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

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

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

"enforceForIndexOf" 选项设置为 true 的此规则的**正确**代码示例

在游乐场中打开
/*eslint use-isnan: ["error", {"enforceForIndexOf": true}]*/

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

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

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

var hasNaN = myArray.some(myIsNaN);

var hasNaN = indexOfNaN(myArray) >= 0;

var firstIndex = indexOfNaN(myArray);

var lastIndex = lastIndexOfNaN(myArray);

// ES2015
var hasNaN = myArray.some(Number.isNaN);

// ES2015
var firstIndex = myArray.findIndex(Number.isNaN);

// ES2016
var hasNaN = myArray.includes(NaN);

已知限制

此选项检查具有给定名称的方法,即使具有该方法的对象不是数组。

版本

此规则是在 ESLint v0.0.6 中引入的。

资源

更改语言