ESLint isNaN'nin beklenmedik kullanımı


154

isNaNBir Node.js modülünde bir ok işlevi içinde genel işlev kullanmaya çalışıyorum ama bu hatayı alıyorum:

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

Bu benim kodum:

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

module.exports = {
  isNumber,
};

Neyi yanlış yaptığım hakkında bir fikrin var mı?

Not: AirBnB stil kılavuzunu kullanıyorum.

Yanıtlar:


282

Gibi belgeler anlaşılacağı kullanın Number.isNaN.

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

Airbnb'nin belgelerinden alıntı:

Neden? Küresel isNaN, sayı olmayan sayıları sayılara zorlar ve NaN'ye zorlanan her şey için doğru döndürür. Bu davranış isteniyorsa, bunu açık yapın.

// 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
Ama isNaNve Number.isNaNaynı işlevleri değildir. Örneğin isNaN('1a') true Number.isNaN('1a') false
rosencreuz

3
@rosencreuz Daha çok istenmeyen davranışlara benzer. Bu yüzden Number('1.2.3')yukarıdaki örnekte var.
Patrick Portal

2
Ne kadar aptalca bir kural, asıl mesele bir sayıya zorlamak ya da sadece bir typeofkontrol yapmak olabilir .
Dominic

Ben kullanımı Number.isNaN(+'1.2.3')sadece fazladan olduğunu +kullanırsanızNumber.isNaN
İbrahim


3

@Andy Gaskell isNumber('1.2.3')dönüş true, size cevap ve kullanımını düzenlemek isteyebilirsiniz Number()yerineparseFloat()

    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

Bu yanıtı şimdi fark ettim. Cevabım güncellendi, teşekkür ederim!
Andy Gaskell

1

Benim durumumda, 5 (tamsayı), 5.4 (ondalık), '5', '5.4' sayılarını sayı olarak ele almak istedim ama örneğin başka bir şey değil.

Benzer gereksinimleriniz varsa, aşağıda daha iyi çalışabilir:

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))

Negatif sayılar eklemek için:

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

Bu, isNaN'in küresel kullanımı sorununuzu da ortadan kaldıracaktır. İsNum işlevini normal bir ES5 işlevine dönüştürürseniz IE tarayıcısında da çalışır.


0

Benim için bu iyi çalıştı ve ESlint ile herhangi bir sorun yoktu

window.isNaN()


AirBnb standardını kullanarak şunları elde etmelisiniz: ESLint: 'window.isNaN' kullanımı kısıtlanmıştır. Lütfen bunun yerine Number.isNaN kullanın (kısıtlayıcı olmayan özellikler)
Bartek Maciejewski

@BartekMaciejewski Number.isNaN ile ilgili sorun, aynı işlevler olmamasıdır. Örneğin. Number.isNaN('abc')olduğunu false. Ve isNaN('abc')olduğunutrue
Yoannes Geissler

Evet, size tamamen katılıyorum - sadece window.isNan()kullanımın diğer AirBnb'nin yapılandırmasına karşı olduğunu belirtmek istedim (kural eslint.org/docs/rules/no-restricted-properties )
Bartek Maciejewski

@BartekMaciejewski Bu bir acı, ne yazık ki no-restricted-propertiesbu sorun yüzünden devre dışı bırakmak zorunda kaldım
Yoannes Geissler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.