Szukaj…
Operacje, które zwracają NaN
Operacje matematyczne na wartościach innych niż liczby zwracają NaN.
"a" + 1
"b" * 3
"cde" - "e"
[1, 2, 3] * 2
Wyjątek: tablice z jedną liczbą.
[2] * [3] // Returns 6
Pamiętaj również, że operator + łączy łańcuchy.
"a" + "b" // Returns "ab"
Dzielenie zera przez zero zwraca NaN .
0 / 0 // NaN
Uwaga: W matematyce ogólnie (w przeciwieństwie do programowania JavaScript) dzielenie przez zero nie jest możliwe.
Funkcje biblioteki matematycznej zwracające NaN
Zasadniczo funkcje Math którym podano argumenty nienumeryczne, zwracają NaN.
Math.floor("a")
Pierwiastek kwadratowy z liczby ujemnej zwraca NaN, ponieważ Math.sqrt nie obsługuje liczb urojonych lub zespolonych .
Math.sqrt(-1)
Testowanie pod kątem NaN za pomocą isNaN ()
window.isNaN()
Za pomocą funkcji globalnej isNaN() można sprawdzić, czy określona wartość lub wyrażenie ma wartość NaN . Ta funkcja (w skrócie) najpierw sprawdza, czy wartość jest liczbą, jeśli nie, próbuje ją przekonwertować (*), a następnie sprawdza, czy wynikową wartością jest NaN . Z tego powodu ta metoda testowania może powodować zamieszanie .
(*) Metoda „konwersji” nie jest taka prosta, szczegółowe wyjaśnienie algorytmu znajduje się w ECMA-262 18.2.3 .
Poniższe przykłady pomogą ci lepiej zrozumieć zachowanie isNaN() :
isNaN(NaN); // true
isNaN(1); // false: 1 is a number
isNaN(-2e-4); // false: -2e-4 is a number (-0.0002) in scientific notation
isNaN(Infinity); // false: Infinity is a number
isNaN(true); // false: converted to 1, which is a number
isNaN(false); // false: converted to 0, which is a number
isNaN(null); // false: converted to 0, which is a number
isNaN(""); // false: converted to 0, which is a number
isNaN(" "); // false: converted to 0, which is a number
isNaN("45.3"); // false: string representing a number, converted to 45.3
isNaN("1.2e3"); // false: string representing a number, converted to 1.2e3
isNaN("Infinity"); // false: string representing a number, converted to Infinity
isNaN(new Date); // false: Date object, converted to milliseconds since epoch
isNaN("10$"); // true : conversion fails, the dollar sign is not a digit
isNaN("hello"); // true : conversion fails, no digits at all
isNaN(undefined); // true : converted to NaN
isNaN(); // true : converted to NaN (implicitly undefined)
isNaN(function(){}); // true : conversion fails
isNaN({}); // true : conversion fails
isNaN([1, 2]); // true : converted to "1, 2", which can't be converted to a number
Ten ostatni jest nieco trudny: sprawdzenie, czy Array to NaN . Aby to zrobić, konstruktor Number() najpierw konwertuje tablicę na ciąg, a następnie na liczbę; jest to powód, dla którego zarówno isNaN([]) i isNaN([34]) zwracają wartość false , ale zarówno isNaN([1, 2]) i isNaN([true]) zwracają wartość true : ponieważ są konwertowane na "" , "34" , "1,2" i "true" . Ogólnie rzecz biorąc, tablica jest uznawana za NaN przez isNaN() chyba że zawiera tylko jeden element, którego reprezentację ciągu można przekonwertować na prawidłową liczbę .
Number.isNaN()
W ECMAScript 6 funkcja Number.isNaN() została zaimplementowana przede wszystkim w celu uniknięcia problemu window.isNaN() polegającego na silnej konwersji parametru na liczbę. Number.isNaN() faktycznie nie próbuje przekonwertować wartości na liczbę przed testowaniem. Oznacza to również, że tylko wartości numeru typu, które są również NaN , zwracają true (co w zasadzie oznacza tylko Number.isNaN(NaN) ).
Po
Number.isNaNz jednymnumberargumentu podejmowane są następujące kroki:
- Jeśli Typ (liczba) nie jest Liczba, zwróć
false.- Jeśli liczba to
NaN, zwróćtrue.- W przeciwnym razie zwróć
false.
Kilka przykładów:
// The one and only
Number.isNaN(NaN); // true
// Numbers
Number.isNaN(1); // false
Number.isNaN(-2e-4); // false
Number.isNaN(Infinity); // false
// Values not of type number
Number.isNaN(true); // false
Number.isNaN(false); // false
Number.isNaN(null); // false
Number.isNaN(""); // false
Number.isNaN(" "); // false
Number.isNaN("45.3"); // false
Number.isNaN("1.2e3"); // false
Number.isNaN("Infinity"); // false
Number.isNaN(new Date); // false
Number.isNaN("10$"); // false
Number.isNaN("hello"); // false
Number.isNaN(undefined); // false
Number.isNaN(); // false
Number.isNaN(function(){}); // false
Number.isNaN({}); // false
Number.isNaN([]); // false
Number.isNaN([1]); // false
Number.isNaN([1, 2]); // false
Number.isNaN([true]); // false
zero
null służy do reprezentowania celowego braku wartości obiektu i jest wartością pierwotną. W przeciwieństwie do undefined , nie jest własnością obiektu globalnego.
Jest równy undefined ale nie identyczny z nim.
null == undefined; // true
null === undefined; // false
Ostrożny: typeof null jest 'object' .
typeof null; // 'object';
Aby poprawnie sprawdzić, czy wartość jest null , porównaj ją z operatorem ścisłej równości
var a = null;
a === null; // true
niezdefiniowany i zerowy
Na pierwszy rzut oka może się wydawać, że null i undefined są w zasadzie takie same, jednak istnieją subtelne, ale ważne różnice.
undefined jest brak wartości w kompilatorze, ponieważ tam, gdzie powinna być wartością, nie została wstawiona, jak w przypadku nieprzypisanej zmiennej.
-
undefinedjest wartością globalną, która reprezentuje brak przypisanej wartości.-
typeof undefined === 'undefined'
-
-
nullto obiekt wskazujący, że zmiennej przypisano jawnie „brak wartości”.-
typeof null === 'object'
-
Ustawienie zmiennej na undefined oznacza, że zmienna faktycznie nie istnieje. Niektóre procesy, takie jak serializacja JSON, mogą usuwać undefined właściwości z obiektów. Natomiast właściwości null wskazują, że zostaną zachowane, dzięki czemu można jawnie przekazać pojęcie „pustej” właściwości.
Poniższe oceny do undefined :
- Zmienna, gdy jest zadeklarowana, ale nie ma przypisanej wartości (tj. Zdefiniowana)
let foo; console.log('is undefined?', foo === undefined); // is undefined? true
- Dostęp do wartości właściwości, która nie istnieje
let foo = { a: 'a' }; console.log('is undefined?', foo.b === undefined); // is undefined? true
- Zwracana wartość funkcji, która nie zwraca wartości
function foo() { return; } console.log('is undefined?', foo() === undefined); // is undefined? true
- Wartość argumentu funkcji, który jest zadeklarowany, ale został pominięty w wywołaniu funkcji
function foo(param) { console.log('is undefined?', param === undefined); } foo('a'); foo(); // is undefined? false // is undefined? true
undefined jest także własnością globalnego obiektu window .
// Only in browsers
console.log(window.undefined); // undefined
window.hasOwnProperty('undefined'); // true
Przed ECMAScript 5 można było faktycznie zmienić wartość właściwości window.undefined na dowolną inną wartość potencjalnie psującą wszystko.
Nieskończoność i nieskończoność
1 / 0; // Infinity
// Wait! WHAAAT?
Infinity jest właściwością obiektu globalnego (a więc zmiennej globalnej), która reprezentuje matematyczną nieskończoność. Jest to odniesienie do Number.POSITIVE_INFINITY
Jest większa niż jakakolwiek inna wartość i można ją uzyskać, dzieląc przez 0 lub oceniając wyrażenie liczby tak dużej, że się przepełnia. Oznacza to, że w JavaScript nie ma podziału na 0 błędów, jest nieskończoność!
Istnieje również -Infinity która jest matematyczną ujemną nieskończonością i jest niższa niż jakakolwiek inna wartość.
Aby uzyskać -Infinity , negujesz Infinity lub uzyskasz odniesienie do niego w Number.NEGATIVE_INFINITY .
- (Infinity); // -Infinity
Teraz zabawmy się przykładami:
Infinity > 123192310293; // true
-Infinity < -123192310293; // true
1 / 0; // Infinity
Math.pow(123123123, 9123192391023); // Infinity
Number.MAX_VALUE * 2; // Infinity
23 / Infinity; // 0
-Infinity; // -Infinity
-Infinity === Number.NEGATIVE_INFINITY; // true
-0; // -0 , yes there is a negative 0 in the language
0 === -0; // true
1 / -0; // -Infinity
1 / 0 === 1 / -0; // false
Infinity + Infinity; // Infinity
var a = 0, b = -0;
a === b; // true
1 / a === 1 / b; // false
// Try your own!
NaN
NaN oznacza „Not a Number”. Gdy funkcja matematyczna lub operacja w JavaScript nie może zwrócić określonej liczby, zwraca wartość NaN .
Jest to właściwość obiektu globalnego i odwołanie do Number.NaN
window.hasOwnProperty('NaN'); // true
NaN; // NaN
Być może mylące jest to, że NaN wciąż jest uważany za liczbę.
typeof NaN; // 'number'
Nie sprawdzaj NaN za pomocą operatora równości. Zamiast tego zobacz isNaN .
NaN == NaN // false
NaN === NaN // false
Stałe liczbowe
Konstruktor Number ma wbudowane stałe, które mogą być przydatne
Number.MAX_VALUE; // 1.7976931348623157e+308 Number.MAX_SAFE_INTEGER; // 9007199254740991 Number.MIN_VALUE; // 5e-324 Number.MIN_SAFE_INTEGER; // -9007199254740991 Number.EPSILON; // 0.0000000000000002220446049250313 Number.POSITIVE_INFINITY; // Infinity Number.NEGATIVE_INFINITY; // -Infinity Number.NaN; // NaN
W wielu przypadkach różne operatory w JavaScript będą łamać wartościami spoza zakresu ( Number.MIN_SAFE_INTEGER , Number.MAX_SAFE_INTEGER )
Należy zauważyć, że Number.EPSILON oznacza różnić się między jedną a najmniejszy Number większą niż jeden, a zatem najmniejszą możliwą różnicę między różnymi Number wartości. Jednym z powodów tego jest fakt, że JavaScript jest przechowywany w liczbach, zobacz Sprawdzanie równości dwóch liczb