use-isnan
在检查 NaN
时要求调用 isNaN()
在 JavaScript 中,NaN
是 Number
类型的一个特殊值。它用于表示 IEEE 标准为二进制浮点数算术所指定的双精度 64 位格式所表示的任何“非数字”值。
由于 NaN
在 JavaScript 中是独一无二的,因为它不等于任何东西,包括它本身,因此与 NaN
的比较结果令人困惑
NaN === NaN
或NaN == NaN
评估为 falseNaN !== 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
此外还禁止使用NaN
的indexOf
和lastIndexOf
方法。默认值为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}]*/
var hasNaN = >= 0;
var firstIndex = ;
var lastIndex = ;
var indexWithSequenceExpression = ;
var firstIndexFromSecondElement = ;
var lastIndexFromSecondElement = ;
将 "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 中引入的。