use-isnan
Требуются вызовы isNaN() при проверке на NaN
Использование конфигурации recommended из @eslint/js в файле конфигурации включает это правило
Некоторые проблемы, сообщённые этим правилом, можно вручную исправить с помощью предложений редактора
В JavaScript, NaN — это специальное значение типа Number. Оно используется для представления любого из значений «не число» (NaN), представленных в формате двойной точности 64 бита, как указано в стандарте IEEE для двоичной арифметики с плавающей точкой.
Поскольку NaN уникально в JavaScript, не являясь равным чему-либо, включая себя, результаты сравнений с NaN вызывают путаницу:
-
NaN === NaNилиNaN == NaNоцениваются как ложь -
NaN !== NaNилиNaN != NaNоцениваются как истина
Поэтому используйте 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(по умолчанию) дополнительно запрещаетcase NaNиswitch(NaN)в операторахswitch. -
"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.
Установите "enforceForIndexOf" в true если хотите, чтобы это правило сообщало о вызовах методов indexOf(NaN) и lastIndexOf(NaN).
Примеры неправильного кода для этого правила с "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.
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/use-isnan