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 中引入。