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...
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?
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
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')
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]"
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.
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!
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ę.
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;
}
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)); }
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