Verwarring tussen isNaN en Number.isNaN in javascript

Ik heb een verwarring over hoe NaN werkt. Ik heb isNaN(undefined)uitgevoerd en truegeretourneerd. Maar als ik Number.isNaN(undefined)gebruik, wordt falsegeretourneerd. Dus welke ik moet gebruiken. Ook waarom er zo’n discrepantie is in het resultaat.


Antwoord 1, autoriteit 100%

Om te citeren uit een ponyfoo-artikel over getallen in ES6:

Number.isNaN is bijna identiek aan de ES5 globale isNaN-methode.
Number.isNaN geeft als resultaat of de opgegeven waarde gelijk is aan NaN. Dit is een
heel andere vraag dan “is dit geen nummer?”.

Dus isNaNcontroleert gewoon of de doorgegeven waarde geen getal is of niet kan worden omgezet in een getal. Number.isNaNdaarentegen controleert alleen of de waarde gelijk is aan NaN(het gebruikt echter een ander algoritme dan ===).

De String 'ponyfoo'bijvoorbeeld is geen getal en kan niet worden omgezet in een getal, maar het is niet NaN.

Voorbeeld:

Number.isNaN({});
// <- false, {} is not NaN
Number.isNaN('ponyfoo')
// <- false, 'ponyfoo' is not NaN
Number.isNaN(NaN)
// <- true, NaN is NaN
Number.isNaN('pony'/'foo')
// <- true, 'pony'/'foo' is NaN, NaN is NaN
isNaN({});
// <- true, {} is not a number
isNaN('ponyfoo')
// <- true, 'ponyfoo' is not a number
isNaN(NaN)
// <- true, NaN is not a number
isNaN('pony'/'foo')
// <- true, 'pony'/'foo' is NaN, NaN is not a number

Antwoord 2, autoriteit 37%

  • isNaNconverteert het argument naar een Numberen retourneert true als de resulterende waarde NaNis.
  • Number.isNaNconverteert het argument niet; het geeft true terug als het argument een Numberis en NaNis.

Dus welke ik moet gebruiken.

Ik vermoed dat u probeert te controleren of de waarde iets is dat op een getal lijkt. In dat geval is het antwoord geen van beide. Deze functies controleren of de waarde een IEEE-754 Not A Numberis. Punt uit. Dit is bijvoorbeeld duidelijk verkeerd:

var your_age = "";
// user forgot to put in their age
if (isNaN(your_age)) {
  alert("Age is invalid. Please enter a valid number.");
} else {
  alert("Your age is " + your_age + ".");
}
// alerts "Your age is ."
// same result when you use Number.isNaN above

Snippet uitvouwen


Antwoord 3, autoriteit 25%

Ik ontdekte dat als je wilt controleren of iets numeriek is (of niet), dan een combinatie van Number.isNaN()met Number.parseInt()of Number.parseFloat()(afhankelijk van wat u verwacht) om de meeste gevallen te dekken:

overweeg:
test een aantal verschillende invoer-vars tegen verschillende is-nummertests:

r = [NaN, undefined, null, false, true, {}, [], '', ' ', 0, 1, '0', '1']
.map(function(v){return [
    v, 
    isNaN(v), 
    Number.isNaN(v), 
    Number.isInteger(v),
    Number.parseInt(v, 10), 
    Number.isNaN( Number.parseInt(v, 10)) 
];});
console.table(r);
// or if console.table() not available:
r.join('\n', function(v){v.join(',')} );

resultaat:

NaN      , true , true , false, NaN, true 
undefined, true , false, false, NaN, true 
null     , false, false, false, NaN, true 
false    , false, false, false, NaN, true 
true     , false, false, false, NaN, true 
Object   , true , false, false, NaN, true 
Array(0) , false, false, false, NaN, true 
''       , false, false, false, NaN, true 
' '      , false, false, false, NaN, true 
0        , false, false, true , 0  , false
1        , false, false, true , 1  , false
'0'      , false, false, false, 0  , false
'1'      , false, false, false, 1  , false

Let op de laatste kolom, dat is meestal wat ik wil in mijn ervaring.


Antwoord 4, autoriteit 8%

Binnenkort,

isNaN()

controleert of het converteren van waarde naar Getal (type) is mislukt

Bijvoorbeeld ‘abc’


Number.isNaN()

controleert of het opgegeven waardetype Getal is, maar geen geldig getal

Bijvoorbeeld: ‘bb’/33


Antwoord 5, autoriteit 3%

Number.isNaN()

Deze methode retourneert true als de waarde van het type Number is en gelijk is aan NaN. Anders wordt false geretourneerd.
bijv.

Number.isNaN(123) //false
Type of 123 is number but 123 is not equal to NaN, therefore it returns false.
Number.isNaN('123') //false
Type of 123 is string & '123' is not equal to NaN, therefore it returns false.
Number.isNaN(NaN) //true
Type of NaN is number & NaN is equal to NaN, therefore it returns true.
Number.isNaN('NaN') //false
Type of 'NaN' is string & 'NaN' is not equal to NaN, therefore it returns false.

algemene isNaN()functie

De globale functie isNaN() converteert de geteste waarde naar een Getal en test deze vervolgens.

isNaN(123) //false
isNaN('123') //false
isNaN(NaN) //true
isNaN('NaN') //true

Other episodes