use-isnan
当检查 NaN 时要求调用 isNaN()
在 JavaScript 中,NaN 是 Number 类型的一个特殊值。它用于表示 IEEE 二进制浮点算术标准指定的双精度 64 位格式表示的任何 “非数字” 值。
因为 NaN 在 JavaScript 中是唯一的,不等于任何值,包括它自身,所以与 NaN 比较的结果会令人困惑
- NaN === NaN或- NaN == NaN的计算结果为- false
- NaN !== NaN或- NaN != NaN的计算结果为- true
因此,使用 Number.isNaN() 或全局 isNaN() 函数来测试一个值是否为 NaN。
规则详情
此规则禁止与 NaN 进行比较。
此规则的 错误 代码示例
/*eslint use-isnan: "error"*/
if () {
    // ...
}
if () {
    // ...
}
if () {
    // ...
}
if () {
    // ...
}
此规则的 正确 代码示例
/*eslint use-isnan: "error"*/
if (isNaN(foo)) {
    // ...
}
if (!isNaN(foo)) {
    // ...
}
选项
此规则有一个对象选项,包含两个选项
- "enforceForSwitchCase": true(默认) 额外禁止在- switch语句中使用- case NaN和- switch(NaN)。
- "enforceForIndexOf": true额外禁止将- indexOf和- lastIndexOf方法与- NaN一起使用。 默认值为- false,这意味着此规则默认情况下不会警告关于- indexOf(NaN)或- lastIndexOf(NaN)方法调用的情况。
enforceForSwitchCase
switch 语句内部使用 === 比较来将表达式的值与 case 子句进行匹配。 因此,它永远无法匹配 case NaN。 此外,switch(NaN) 也永远无法匹配 case 子句。
当 "enforceForSwitchCase" 选项设置为 true (默认) 时,此规则的 错误 代码示例
/*eslint use-isnan: ["error", {"enforceForSwitchCase": true}]*/
switch (foo) {
    
    case 1:
        baz();
        break;
    // ...
}
switch (foo) {
    
    case 1:
        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
以下方法内部使用 === 比较来将给定值与数组元素进行匹配
因此,对于任何数组 foo,foo.indexOf(NaN) 和 foo.lastIndexOf(NaN) 将始终返回 -1。
如果你希望此规则报告 indexOf(NaN) 和 lastIndexOf(NaN) 方法调用,请将 "enforceForIndexOf" 设置为 true。
当 "enforceForIndexOf" 选项设置为 true 时,此规则的 错误 代码示例
/*eslint use-isnan: ["error", {"enforceForIndexOf": true}]*/
const hasNaN =  >= 0;
const firstIndex = ;
const lastIndex = ;
const indexWithSequenceExpression = ;
const firstIndexFromSecondElement = ;
const lastIndexFromSecondElement = ;
当 "enforceForIndexOf" 选项设置为 true 时,此规则的 正确 代码示例
/*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 中引入。