ESLint isNaNの予期しない使用


154

isNaNNode.jsモジュールの矢印関数内でグローバル関数を使用しようとしていますが、次のエラーが発生します。

[eslint] Unexpected use of 'isNaN'. (no-restricted-globals)

これは私のコードです:

const isNumber = value => !isNaN(parseFloat(value));

module.exports = {
  isNumber,
};

私が間違っていることについて何か考えはありますか?

PS:AirBnBスタイルガイドを使用しています。

回答:


282

ドキュメントが提案する、使用Number.isNaN

const isNumber = value => !Number.isNaN(Number(value));

Airbnbのドキュメントを引用:

どうして?グローバルisNaNは、非数値を数値に強制変換し、NaNに強制変換するすべての場合にtrueを返します。この動作が必要な場合は、明示的にしてください。

// bad
isNaN('1.2'); // false
isNaN('1.2.3'); // true

// good
Number.isNaN('1.2.3'); // false
Number.isNaN(Number('1.2.3')); // true

28
しかしisNaNNumber.isNaN同じ機能ではありません。たとえば isNaN('1a') true Number.isNaN('1a') false
ローゼンクロイツ

3
@rosencreuz望ましくない動作のようなもの。それがNumber('1.2.3')上記の例にある理由です。
Patrick Portal、

2
なんてばかげたルールなのか、全体のポイントは、数値に強制することですtypeof。そうしないと、チェックを実行するだけで済みます。
ドミニク

私が使用する場合、Number.isNaN(+'1.2.3')これは使用する+場合の追加Number.isNaN
料金


3

@Andy Gaskell isNumber('1.2.3')return true、答えを編集してNumber()parseFloat()

    const isEmpty = value => typeof value === 'undefined' || value === null || value === false;
    const isNumeric = value => !isEmpty(value) && !Number.isNaN(Number(value));
  console.log(isNumeric('5')); // true
  console.log(isNumeric('-5')); // true
  console.log(isNumeric('5.5')); // true
  console.log(isNumeric('5.5.5')); // false
  console.log(isNumeric(null)); // false
  console.log(isNumeric(undefined)); // false

今、この答えに気づきました。回答が更新されました。ありがとうございます。
Andy Gaskell

1

私の場合、5(整数)、5.4(10進数)、 '5'、 '5.4'を数値として扱いたいと思っていました。

同様の要件がある場合は、以下の方が効果的です。

const isNum = num => /^\d+$/.test(num) || /^\d+\.\d+$/.test(num);

//Check your variable if it is a number.
let myNum = 5;
console.log(isNum(myNum))

負の数を含めるには:

const isNum = num => /^-?\d+$/.test(num) || /^-?\d+\.\d+$/.test(num);

これにより、isNaNのグローバルな使用の問題もなくなります。isNum関数を通常のES5関数に変換すると、IEブラウザーでも機能します。


0

私にとってこれはうまくいき、ESlintには何の問題もありませんでした

window.isNaN()


ESLint: 'window.isNaN'の使用は制限されています。代わりにNumber.isNaNを使用してください(no-restricted-properties)
Bartek Maciejewski

@BartekMaciejewski Number.isNaNの問題は、同じ関数ではないことです。例えば。Number.isNaN('abc')ですfalse。そしてisNaN('abc')あるtrue
Yoannesガイスラー

はい、私はあなたに完全に同意します-使用window.isNan()は他のAirBnbの構成に反することを述べたいだけです(ルールはeslint.org/docs/rules/no-restricted-propertiesです
Bartek Maciejewski

@BartekMaciejewskiこれは苦痛no-restricted-propertiesです。この問題のため、残念ながら非アクティブ化する必要がありました
Yoannes Geissler
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.