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śli NaN
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:
- albo utworzyć
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;
- lub uczynić
NaN
jednostkę typu pierwotnego number
(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
do number
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ącego NaN
albo będzie NaN
, albo prowadził do nieprzewidywalnych wyników, takich jak NaN < 0
obliczanie do false
, czyli zwracanie boolean
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
.