To Numer.IsNaN ()()

Soooo isNaN jest najwyraźniej złamany w JavaScript, z takimi rzeczami jak:

isNaN('')
isNaN('   ')
isNaN(true)
isNaN(false)
isNaN([0])

Zwracanie false, gdy wydają się być wszystkie... Nie Numer...

W ECMAScript 6, szkic zawiera nowy Number.isNaN, ale wygląda na to, (imo), że to również jest zepsute...

Spodziewałbym się

Number.isNaN('RAWRRR')

Aby zwrócić true, ponieważ jest to ciąg znaków i nie może być przekonwertowany na liczbę... Jednak...

Tutaj wpisz opis obrazka

Wydaje się, że rzeczy, które rozważyłbym... Nie liczby, są w rzeczy samej, Nie, Nie numer...

Http://people.mozilla.org/ ~ jorendorff / es6-draft. html#sec-isfinite-number

Przykłady na MDN mówią:

Liczba.isNaN ("blabla"); / / np. byłoby to prawdą w przypadku isNaN

Nie rozumiem, jak to jest " bardziej solidna wersja oryginalnego globalnego isNaN."kiedy nie mogę sprawdzić, czy coś nie jest liczbą.

Oznaczałoby to, że nadal jesteśmy poddawani sprawdzaniu typu, jak również sprawdzam isNaN... co wydaje się głupie...

Http://people.mozilla.org/ ~ jorendorff / es6-draft. html#sec-isnan-number

Szkic ES3 tutaj zasadniczo mówi, wszystko jest zawsze Fałszywe, z wyjątkiem jego numeru.NaN

Czy ktoś jeszcze uważa, że to jest zepsute, czy po prostu nie rozumiem sensu isNaN?

Author: Phill, 2014-08-07

8 answers

isNaN() i Number.isNaN() Oba sprawdzają, czy wartość jest (lub, w przypadku isNaN(), może być przekonwertowana na wartość typu liczbowego, która reprezentuje) wartością NaN. Innymi słowy, "NaN" nie oznacza po prostu "ta wartość nie jest liczbą", a konkretnie oznacza "ta wartość jest numeryczną nie-wartością liczbową zgodnie z IEEE-754".

Powodem, dla którego wszystkie powyższe testy zwracają false jest to, że wszystkie podane wartości mogą być przekonwertowane na wartość liczbową, która nie jest NaN:

Number('')    // 0
Number('   ') // 0
Number(true)  // 1
Number(false) // 0
Number([0])   // 0

The powód isNaN() jest "zepsuty", ponieważ pozornie konwersje typów nie powinny mieć miejsca podczas testowania wartości. To jest problem Number.isNaN() jest przeznaczony do rozwiązania. W szczególności, Number.isNaN() tylko spróbuje porównać wartość z NaN, jeśli wartość jest wartością typu liczbowego. Każdy inny typ zwróci false, nawet jeśli są dosłownie "Nie liczbą", ponieważ typ wartości NaN to liczba. Zobacz odpowiednie dokumenty MDN dla isNaN() oraz Number.isNaN().

Jeśli po prostu chcesz określić, czy wartość jest typu number, nawet jeśli wartość ta jest NaN, użyj typeof zamiast:

typeof 'RAWRRR' === 'number' // false
 61
Author: BoltClock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 04:39:46

Nie, oryginał jest zepsuty. Nie rozumiesz sensu isNaN.

Celem obu tych funkcji jest określenie, czy coś ma wartość NaN. Jest to zapewnione, ponieważ something === NaN zawsze będzie false i dlatego nie może być użyte do przetestowania tego. (uwaga na marginesie: something !== something jest w rzeczywistości wiarygodnym, choć intuicyjnym testem dla NaN)

Powodem isNaN jest to, że może zwrócić true w przypadkach, gdy wartość nie jest w rzeczywistości NaN. Dzieje się tak dlatego, że najpierw wymusza wartość do liczby.

Więc

isNaN("hello")

Jest true, mimo że "hello" nie jest NaN.

Jeśli chcesz sprawdzić, czy wartość rzeczywiście jest liczbą skończoną, możesz użyć:

Number.isFinite(value)

Jeśli chcesz sprawdzić, czy wartość jest liczbą skończoną, czy reprezentacją ciągu znaków jedynki, możesz użyć:

Number.isFinite(value) || (Number.isFinite(Number(value)) && typeof value === 'string')
 15
Author: JLRishe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-26 12:29:36

Kluczową różnicą między nimi jest to, że funkcja globalna isNaN(x) wykonuje konwersję parametru x na liczbę. Więc

isNaN("blabla") === true

Ponieważ Number("blabla") daje NaN

Istnieją dwie definicje "Nie liczby" tutaj i być może tam leży zamieszanie. Number.isNaN(x) zwraca true tylko dla definicji specyfikacji zmiennoprzecinkowej IEEE 754, na przykład:

Number.isNaN(Math.sqrt(-1))

W przeciwieństwie do określania, czy przekazywany obiekt jest liczbowy pisz czy nie. Niektóre sposoby to:

typeof x === "number"
x === +x
Object.prototype.toString.call(x) === "[object Number]"
 6
Author: Tom Fenech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-07 07:41:11

Jak wspomniano w komentarzu isNaN() i Number.isNaN() oba sprawdzają, czy przekazywana wartość nie jest równa wartości NaN. Kluczem jest to, że NaN jest wartością rzeczywistą, a nie ocenianym wynikiem, np. "blabla" jest String, a wartością jest "blabla", co oznacza, że nie jest to wartość "NaN".

Prawdopodobnym rozwiązaniem byłoby zrobienie czegoś w stylu:

Number.isNaN(Number("blabla")); //returns true.
 5
Author: kaspermoerch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-07 07:34:44

Zasadniczo, window.isNaN wykonuje konwersję typu na liczbę, a następnie sprawdza, czy jest to NaN. Natomiast Number.isNaN nie próbuje przekonwertować swojego argumentu na liczbę. Tak zasadniczo można myśleć o window.isNaN i Number.isNaN jako o tym, że działają w ten sposób.

window.isNaN = function(n){
    return Number(n) !== Number(n);
}

window.Number.isNaN = function(n){
    return n !== n;
}

Zwróć uwagę, że nie potrzebujesz w rzeczywistości window., aby zadzwonić isNaN lub Number.isNaN. Raczej używam go, aby zapewnić lepsze rozróżnienie między dwoma podobnie nazwanymi metodami, aby spróbować ograniczyć zamieszanie.

~ Happy Coding!

 1
Author: Jack Giffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-07 16:25:27

1. Numer.isNaN

alert(Number.isNaN('Hello')); // false 

Czy nie powinno zwracać true Ponieważ Hello jest string i jego Not A Number prawda? Ale pozwala wiedzieć, dlaczego zwraca false.

MDN docs says:

True, jeśli podana wartość to NaN, a jej typem jest liczba; w przeciwnym razie, fałsz.

Tak Hello wartość to NaN ale typem jest string, możesz sprawdzić typ w następujący sposób:

alert(typeof `Hello`);  // string

Użycie:

Użyj, gdy chcesz sprawdzić wartość jest zarówno NaN, jak i type jest liczbą.

2. isNaN

alert(isNaN('Hello')); // true

MDN docs says:

True jeśli podana wartość to NaN; w przeciwnym razie false.

Użycie:

Użyj, gdy chcesz sprawdzić wartość jest po prostu NaN.

3. jQuery.isNumeric()

JQuery Docs Says:

Określa, czy jego argument reprezentuje JavaScript numer.

alert($.isNumeric('Hello')); // false
alert($.isNumeric(3)); //true

Użycie:

Użyj, gdy chcesz sprawdzić, czy wartość jest liczbą lub może być przekonwertowana na liczbę.

Numer referencyjny

 1
Author: stom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-21 12:30:53

Poniższe działanie działa, ponieważ NaN jest jedyną wartością w javascript, która nie jest sobie równa.

Number.isNaN = Number.isNaN || function(value) {     
    return value !== value;
}
 1
Author: sendon1982,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 04:30:21

Per, MDN, it (NaN) jest zwracaną wartością, gdy funkcje matematyczne zawodzą i jako taka jest wartością specyficzną. Być może byłaby lepsza nazwa, MathFunctionFailed.

Aby określić, czy coś jest liczbą, wymaga parsowania, które nie powiedzie się na szerokim zakresie wejść nieliczbowych, skutecznie wykrywając Liczby i łańcuchy reprezentujące liczby, stąd:

function isNumber(v) {return Number.isNaN(parseFloat(v)); }

 0
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 13:27:41