Z czystej ciekawości.
Nie wydaje się logiczne, że typeof NaN
jest to liczba. Nawiasem mówiąc, tak jak NaN === NaN
lub NaN == NaN
zwracając fałsz. Czy jest to jedna z cech javascript, czy może byłby tego powód?
Edycja: dzięki za odpowiedzi. Nie jest jednak łatwo przekonać kogoś do siebie. Czytając odpowiedzi i wiki zrozumiałem więcej, ale nadal, zdanie takie jak
Porównanie z NaN zawsze zwraca nieuporządkowany wynik, nawet w porównaniu z samym sobą. Predykaty porównania są albo sygnalizujące, albo nie sygnalizujące, wersje sygnalizacyjne sygnalizują nieważny wyjątek dla takich porównań. Predykaty równości i nierówności nie sygnalizują, więc x = x zwracające fałsz może być użyte do sprawdzenia, czy x jest cichym NaN.
tylko kręci mi w głowie. Gdyby ktoś mógł to przetłumaczyć na ludzki (w przeciwieństwie do, powiedzmy, matematyka) czytelny język, byłbym wdzięczny.
źródło
isNumeric
od sprawdzania typu:$.isNumeric(NaN);
zwraca false, gdzie as$.type(NaN);
zwraca liczbę. api.jquery.com/jQuery.isNumericOdpowiedzi:
To znaczy nie jest liczbą. Nie jest to osobliwość javascript, ale powszechna zasada informatyki.
Z http://en.wikipedia.org/wiki/NaN :
Wszystkie te wartości mogą nie być takie same. Prosty test na NaN polega na tym, że test
value == value
jest fałszywy.źródło
isNaN(value)
isNaN(undefined)
zwracatrue
, aleundefined == undefined
jest również prawdziwe. To samo dotyczy wszystkich innych typów nieliczbowych, z wyjątkiemnull
.value !== value
jest to prawdopodobnie najkrótszy sposób sprawdzenia, czy takvalue
jestNaN
.Cóż,
NaN
nadal jest typem numerycznym , mimo że faktycznie oznacza Not-A-Number :-)NaN
oznacza po prostu, że określona wartość nie może być reprezentowana w ramach ograniczeń typu liczbowego (chociaż można to powiedzieć o wszystkich liczbach, które muszą zostać zaokrąglone w celu dopasowania, aleNaN
jest to przypadek specjalny).Określony
NaN
nie jest uważany za równy drugiemu,NaN
ponieważ mogą mieć różne wartości. JednakNaN
nadal jest typem liczbowym, podobnie jak 2718 lub 31415.Co do zaktualizowanego pytania, aby wyjaśnić w kategoriach laika:
Wszystko to oznacza (podzielone na części):
Zasadniczo a
NaN
nie jest równe żadnej innej liczbie, w tym innejNaN
, a nawet samej sobie .Próba wykonania operacji porównania (mniej niż, większe niż itd.) Między a
NaN
i inną liczbą może spowodować zgłoszenie wyjątku (sygnalizacja) lub po prostu uzyskanie wyniku fałszywego (brak sygnalizacji lub cichy).Testy równości (równe, nie równe) nigdy nie sygnalizują, więc ich użycie nie spowoduje wyjątku. Jeśli masz zwykły numer
x
,x == x
zawsze będzie prawdziwy. Jeślix
jestNaN
, tox == x
zawsze będzie fałszem. Daje ci sposób naNaN
łatwe (ciche) wykrycie .źródło
typeof a === 'number'
oznacza „a jest przechowywany wewnętrznie jako pływak IEEE 754”Infinity === Infinity
zwraca,true
skoro anInfinity
można wygenerować przez różne wartości: 1,0 / 0,0 lub 2,0 / 0,0?1/0
i2/0
leżę w tej samej klasie i (2) w IEEE754 jest tylko jedna klasa nieskończoności (inna niż+/-
oczywiście).0/0
nie są definiowane w żaden znaczący sposób, poza stwierdzeniem, że jego „wartością” jest cały zbiór liczb. A nawet jeśli zostały zdefiniowane,Math.log(-1) == Math.log(-1)
nadal ocenia się dofalse
. Zatem nie tylko nie ma innych „rzeczywistych liczb”,NaN
ale nawet gdyby istniały, nie były one używane do porównań.Standard ECMAScript (JavaScript) określa, że
Numbers
są to zmiennoprzecinkowe IEEE 754 , które zawierająNaN
jako możliwą wartość.źródło
typeof NaN
zwraca,'number'
ponieważ:Specyfikacja ECMAScript mówi, że typ liczby zawiera NaN:
Więc
typeof
zwraca odpowiednio:To zachowanie jest zgodne ze standardem IEEE dla arytmetyki zmiennoprzecinkowej (IEEE 754) :
źródło
NaN to poprawna wartość zmiennoprzecinkowa ( http://en.wikipedia.org/wiki/NaN )
a NaN === NaN jest fałszem, ponieważ niekoniecznie są one tą samą liczbą nieliczną
źródło
Infinity
są w jakiś sposób identyczne? jakieś pomysły?NaN != NaN
ponieważ nie są one potrzebne TEN SAM numer. Dlatego ma to dużo sensu ... Również dlaczego zmiennoprzecinkowe mają zarówno +0,00, jak i -0,00, które nie są takie same. Zaokrąglanie może sprawić, że w rzeczywistości nie są one zerowe.Jeśli chodzi o typ, to zależy od języka. A większość języków powie, że NaN jest liczbą zmiennoprzecinkową, podwójną lub liczbą, w zależności od tego, jak ją sklasyfikują ... Nie znam żadnych języków, które powie, że jest to nieznany typ lub zerowy.
źródło
number
,NaN
jest prymitywny i stąd jednoznacznie wyznaczona przez jego wartość.NaN
oznacza Not a Number . Jest to wartość liczbowych typów danych (zwykle typów zmiennoprzecinkowych, ale nie zawsze), która reprezentuje wynik nieprawidłowej operacji, takiej jak dzielenie przez zero.Chociaż jego nazwa mówi, że nie jest to liczba, typ danych używany do jej przechowywania jest typem liczbowym. Tak więc w JavaScript pytanie o typ danych
NaN
zwrócinumber
(jakalert(typeof(NaN))
wyraźnie widać).źródło
Infinity
nieNaN
Javascript używa NaN do reprezentowania wszystkiego, co napotka, czego nie można przedstawić w żaden inny sposób w jego specyfikacjach. Nie oznacza to, że to nie jest liczba. To po prostu najłatwiejszy sposób opisania spotkania. NaN oznacza, że to samo lub obiekt, który się do niego odwołuje, nie może być reprezentowane w żaden inny sposób przez JavaScript. Ze wszystkich praktycznych względów jest „nieznane”. Będąc „nieznanym”, nie jest w stanie powiedzieć, czym jest, ani nawet czy jest sobą. Nie jest to nawet obiekt, do którego jest przypisany. Może tylko powiedzieć, czym nie jest, a nie-istnienie lub nicość można opisać matematycznie tylko w języku programowania. Ponieważ matematyka dotyczy liczb, javascript reprezentuje nicość jako NaN. To nie znaczy, że to nie jest liczba. Oznacza to, że nie możemy tego czytać w żaden inny sposób, który ma sens. Dlatego może nie dorównuje sobie. Ponieważ tak nie jest.
źródło
Lepsza nazwa
NaN
, opisująca jego znaczenie dokładniej i mniej myląco, byłaby liczbowym wyjątkiem . Jest to naprawdę inny rodzaj obiektu wyjątku przebranego za posiadający typ pierwotny (zgodnie z projektem języka), podczas gdy jednocześnie nie jest traktowany jako prymitywny w swoim fałszywym porównywaniu siebie. Skąd zamieszanie. Tak długo, jak język „nie podejmie decyzji”, aby dokonać wyboru między właściwym przedmiotem wyjątku a prymitywną liczbą , zamieszanie pozostanie.Niesławna nierówność
NaN
samego siebie, zarówno==
i===
jest przejawem zagmatwanego projektu, który zmusza ten wyjątkowy obiekt do bycia typem prymitywnym. Łamie to podstawową zasadę, że prymityw jest wyjątkowo określony przez swoją wartość . JeśliNaN
wolisz być postrzegany jako wyjątek (którego mogą być różne rodzaje), to nie powinien być „sprzedawany” jako prymitywny. A jeśli ma być prymitywny, musi obowiązywać ta zasada. Dopóki jest zepsuty, tak jak w JavaScript, i nie możemy tak naprawdę zdecydować między nimi, zamieszanie prowadzące do niepotrzebnego obciążenia poznawczego dla wszystkich zaangażowanych pozostanie. Co jednak jest naprawdę łatwe do naprawienia, po prostu dokonując wyboru między nimi:NaN
specjalny obiekt wyjątku zawierający przydatne informacje o tym, jak powstał wyjątek, w przeciwieństwie do odrzucania tych informacji jako tego, co jest obecnie zaimplementowane, co prowadzi do trudniejszego do debugowania kodu;NaN
jednostkę typu pierwotnegonumber
(która mogłaby być mniej myląco nazywana „numeryczną”), w którym to przypadku powinna być sobie równa i nie może zawierać żadnych innych informacji; ten ostatni jest zdecydowanie gorszym wyborem.Jedyną zaletą pomyślenia zmuszając
NaN
donumber
typu jest w stanie wyrzucić go z powrotem do dowolnego wyrażenia numerycznego. Co jednak sprawia, że wybór jest trudny, ponieważ wynik dowolnego wyrażenia liczbowego zawierającegoNaN
albo będzieNaN
, albo prowadził do nieprzewidywalnych wyników, takich jakNaN < 0
obliczanie dofalse
, czyli zwracanieboolean
zamiast zachowania wyjątku.I nawet jeśli „rzeczy są takie, jakie są”, nic nie stoi na przeszkodzie, abyśmy dokonali tego wyraźnego rozróżnienia dla siebie, aby nasz kod był bardziej przewidywalny i łatwiejszy do debugowania. W praktyce oznacza to identyfikowanie tych wyjątków i traktowanie ich jako wyjątków. Co niestety oznacza więcej kodu, ale miejmy nadzieję, że zostanie to złagodzone przez narzędzia takie jak TypeScript of Flowtype.
A potem mamy niechlujne, ciche i hałaśliwe, czyli
NaN
rozróżnienie sygnalizacyjne . To naprawdę dotyczy tego, jak obsługiwane są wyjątki, a nie same wyjątki i nic nie różni się od innych wyjątków.Podobnie
Infinity
i+Infinity
są elementami typu numerycznego powstającymi w przedłużeniu prostej rzeczywistej, ale nie są to liczby rzeczywiste. Matematycznie można je przedstawić za pomocą sekwencji liczb rzeczywistych zbiegających się do albo+
lub-Infinity
.źródło
Dzieje się tak po prostu dlatego, że
NaN
jest to właściwość obiektu Number w JS, nie ma to nic wspólnego z tym, że jest liczbą.źródło
Number.fu = "bar"; alert(typeof Number.fu);
NaN
nie jest przechowywaną wartościąNumber.NaN
, cokolwiek by to nie było.NaN
jest wartością pierwotną typu Number. I dodatkowo wartośćNumber.NaN
jestNaN
, ale to nie ma związku.Najlepszym sposobem myślenia o NAN jest to, że nie jest to znana liczba. Dlatego NAN! = NAN, ponieważ każda wartość NAN reprezentuje jakąś niepowtarzalną nieznaną liczbę. Sieci NAN są niezbędne, ponieważ liczby zmiennoprzecinkowe mają ograniczony zakres wartości. W niektórych przypadkach dochodzi do zaokrąglania, gdy niższe bity są tracone, co prowadzi do czegoś, co wydaje się być nonsensem, na przykład 1,0 / 11 * 11! = 1,0. Naprawdę duże wartości, które są większe, to NAN, a nieskończoność jest doskonałym przykładem.
Biorąc pod uwagę, że mamy tylko dziesięć palców, każda próba pokazania wartości większych niż 10 jest niemożliwa, co oznacza, że takie wartości muszą być wartościami NAN, ponieważ utraciliśmy prawdziwą wartość tej wartości większej niż 10. To samo dotyczy wartości zmiennoprzecinkowych, gdzie wartość przekracza granice tego, co może być przechowywane w zmiennej zmiennoprzecinkowej.
źródło
Ponieważ NaN jest liczbowym typem danych.
źródło
NaN
jest liczbą z punktu widzenia typu, ale nie jest zwykłą liczbą, taką jak 1, 2 lub 329131. Nazwa „Not A Number” odnosi się do faktu, że reprezentowana wartość jest specjalna i dotyczy dziedziny specyfikacji formatu IEEE, a nie domena języka javascript.źródło
Jeśli korzystam z jQuery, wolę
isNumeric
od sprawdzania typu:http://api.jquery.com/jQuery.isNumeric/
źródło
isNumber
odutil
pakietu maszynopis. Dobrze, że nadal używamyjQuery
w naszym projekcie, więc zamiast tego skorzystaj z Twojej sugestii.isNumber
fromutil
of maszynopis również zwraca siętrue
poNaN
.Javascript ma tylko jeden liczbowy typ danych, czyli standardowy 64-bitowy zmiennoprzecinkowy o podwójnej precyzji. Wszystko jest podwójne. NaN to specjalna wartość podwójna, ale mimo to jest podwójna.
Wszystko, co
parseInt
robi, to „rzutowanie” łańcucha na numeryczny typ danych, więc wynikiem jest zawsze „liczba”; tylko jeśli oryginalny łańcuch nie był analizowalny, jego wartością będzie NaN.źródło
NaN nadal jest typem liczbowym, ale reprezentuje wartość, która nie może reprezentować prawidłowej liczby.
źródło
Moglibyśmy argumentować, że NaN jest obiektem szczególnym. W tym przypadku obiekt NaN reprezentuje liczbę, która nie ma żadnego matematycznego sensu. W matematyce jest kilka innych obiektów specjalnych, takich jak INFINITE i tak dalej.
Nadal możesz z nim wykonać pewne obliczenia, ale spowoduje to dziwne zachowania.
Więcej informacji tutaj: http://www.concentric.net/~ttwang/tech/javafloat.htm (oparty na Javie, nie javascript)
źródło
Musisz pokochać Javascript. Ma kilka interesujących drobiazgów.
http://wtfjs.com/page/13
Większość z tych dziwactw można wytłumaczyć, jeśli przestaniesz je logicznie rozwiązywać lub jeśli wiesz trochę o teorii liczb, ale mimo to mogą cię złapać, jeśli o nich nie wiesz.
Swoją drogą, polecam przeczytanie pozostałej części http://wtfjs.com/ - można znaleźć o wiele więcej ciekawych dziwactw niż ten!
źródło
Wartość NaN to tak naprawdę liczba, więc gdy zapytasz, czy jest to liczba, powie tak. Zrobiłeś właściwą rzecz, używając wywołania isNaN ().
Dla informacji, NaN można również zwrócić przez operacje na liczbach, które nie są zdefiniowane, jak dzielenie przez zero lub pierwiastek kwadratowy liczby ujemnej.
źródło
NaN == Number.NaN
ocenia się nafalse
!NaN==NaN
istociefalse
, musiał to być sadysta, który to wymyślił, żeby wszyscy cierpieli.Przykład
Wyobraź sobie, że zamieniamy ciąg na liczbę:
Zmieniliśmy typ danych na numer, ale jego wartość nie jest liczbą!
źródło
NaN
jest typu liczbowego . Pytanie brzmi: dlaczego.Jest to specjalna wartość typu Liczba jako POSITIVE_INFINITY
Czemu? Przez projekt
źródło