Co dokładnie nie zdefiniowano w JavaScript? Dlaczego tam jest? Jakie ma zastosowania? Jak to może być przydatne?

11

W JavaScript mamy coś o nazwie undefined . Powiedziałem coś, ponieważ tak naprawdę nie wiem, czy jest to klasa podstawowa, wbudowana zmienna, słowo kluczowe, czy cokolwiek innego. Po prostu wiem, że tam jest.

Aby zobaczyć to w akcji, możesz po prostu napisać:

undefined;
typeof undefined;

Czy ktoś może mi wyjaśnić, dlaczego ta rzecz została wstawiona do JavaScript? Mamy nullwartość w tym języku, więc nie powinno to być coś takiego null. W innych językach, gdy nie znamy wartości właściwości lub zmiennej, po prostu ustawiamy ją na null. Tutaj możemy zrobić to samo.

Jak możemy użyć tej rzeczy w JavaScript?

Saeed Neamati
źródło
Zostało to omówione w tym miejscu na reklamie stackoverflow.com/questions/6999291/...
Paul

Odpowiedzi:

13

Są dwa rzeczy, które musisz zrozumieć o niezdefiniowanym ...

  • typ undefined , który może mieć tylko jedną wartość .
  • zmienna undefined

Teraz przeczytaj uważnie następujące informacje ...

  • Jest tak wiele wartości typu number(10, 10.01, 1e1). Ale może być tylko jedna wartość typu undefinedi ta wartość jest przechowywana w zmiennej undefined. Wartość ta nie ma dosłownego reprezentacji - na przykład, wartości numeryczne 1, 100, 1e-1to wszystkie literały z numerem typu, ale wartość przechowywana w zmiennej undefinednie ma dosłownego formularza.

  • undefinedjest zmienną, zwykłą zmienną, którą JavaScript deklaruje i przypisuje jej wartość typu undefinedw zakresie globalnym. Możesz więc wykonać następujące czynności ...

  typ niezdefiniowany; // "nieokreślony"

  niezdefiniowany = 100;
  typ niezdefiniowany; // „liczba”

  undefined = void 0;
  typ niezdefiniowany; // "nieokreślony"

  window.undefined === undefined; // prawdziwe
  window.undefined === void 0; // prawdziwe
  
  • jeśli nie chcesz używać zmiennej undefined, możesz wygenerować wartość typu undefinedprzez wyrażenie void 0- którego jedynym celem jest zwrócenie wartości typu undefined.

... czy ktoś może mi wyjaśnić, dlaczego ta rzecz została wstawiona do JavaScript ...

NIE. Tak jak nikt nie jest w stanie wyjaśnić, dlaczego niezadeklarowane zmienne mają zasięg globalny zamiast lokalnego. Musisz po prostu wytrenować się, aby mądrze z niego korzystać, zamiast próbować znaleźć uzasadnienie dla jego istnienia.

... mamy wartość zerową ...

Chociaż nullpotrafi to robić undefined, jest mniej więcej związane ze objectsskalarami. Rzeczywiście, JavaScript uważa nullsię za obiekt - typeof nullzwraca „obiekt”.

Moim zdaniem, podstawową rzeczą jest, aby NIE próbować uzasadniać bezwzględnych celów undefinedi null- i używać ich w kodzie w sposób inteligentny, aby kod był czytelny, możliwy do utrzymania i wielokrotnego użytku.

treecoder
źródło
2
Dobre wyjaśnienie @greengit. the bottom line is to NOT try to reason the absolute purposes of undefined and null, wygląda na to, że JavaScript jest znacznie mniejszy niż język logiczny i po prostu musimy się do niego przyzwyczaić, jak eksperymentowanie z nowym światem.
Saeed Neamati,
1
„którego jedynym celem jest zwrócenie wartości typu undefined”. Faktycznie voidocenia wyrażenie, ignoruje zwracaną wartość i zwraca undefinedwartość. Co do różnic. undefinedjest używany przez silnik JS, aby powiedzieć, że ta rzecz nie ma żadnej wartości. nulljest używany przez TY, aby powiedzieć, że ta rzecz nie ma żadnej wartości. Istnieje wyraźne rozróżnienie.
Raynos,
1
undefined = 100; typeof undefined;zwraca „niezdefiniowane” dla mnie, jeśli spróbujesz przypisać do null, pojawi się błąd. Chciałem tylko wyjaśnić to przyszłym czytelnikom.
Josh Rumbut,
6

Przepraszamy za odpowiedź na starsze pytanie, ale powód, dla którego potrzebujesz zarówno niezdefiniowanej, jak i zerowej jest prosty: w opartym na prototypach języku typowania kaczego absolutnie musisz rozróżnić „ten obiekt nie definiuje wartości dla X” i „ten obiekt mówi, że X jest nic / null / empty ".

Bez tej możliwości nie można przejść przez łańcuch prototypów, więc dziedziczenie nie może działać; musisz być w stanie stwierdzić, że obj.someProp jest niezdefiniowany, abyś mógł spojrzeć na obj.prototype.someProp i dalej w górę łańcucha, aż znajdziesz wartość. Jeśli obiekt obj.someProp zwrócił wartość null, nie byłoby sposobu, aby dowiedzieć się, czy tak naprawdę było to null, czy po prostu oznaczało „spójrz na mój prototyp”. Jedynym innym sposobem na to jest wstrzyknięcie trochę kulistej magii za kulisy, która przerywa twoją zdolność do poruszania się za pomocą prototypowych łańcuchów i robienia różnych innych fragmentów czarnej magii JS.

Podobnie jak w przypadku Javascript, idea niezdefiniowanego i zerowego wydaje się na początku dziwna i głupia, a potem absolutnie genialna później (potem wraca do dziwnej i głupiej, ale z rozsądnym wyjaśnieniem).

Język taki jak C # nie będzie się kompilował, jeśli uzyskasz dostęp do właściwości, która nie istnieje, a inne języki dynamiczne często zgłaszają wyjątki w czasie wykonywania po dotknięciu właściwości, która nie istnieje, co oznacza, że ​​musisz użyć specjalnych konstrukcji, aby je przetestować. Klasy Plus oznaczają, że po utworzeniu instancji obiektu znasz już jego łańcuch dziedziczenia i wszystkie jego właściwości - w JS mogę zmodyfikować prototyp o 15 kroków w górę łańcucha, a zmiany te pojawią się na istniejących obiektach.

Russbishop
źródło
3

Istnieje zmienna globalna undefined, która jest ustawiona na niezdefiniowaną wartość. Zli ludzie mogą ustawić coś innego, więc prawdopodobnie najlepiej nie ufać temu.

  • Niezdefiniowana wartość jest wartością zwracaną przez funkcję, która nie zwraca wartości.
  • Niezdefiniowana wartość jest wartością zmiennej, która nie została przypisana.
  • Niezdefiniowana wartość to wartość parametru, który nie został przekazany.
  • Niezdefiniowana wartość to wartość właściwości, która nie została przypisana.
  • „undefined” to rodzaj niezadeklarowanej zmiennej. ( typeof undeclaredVariable == 'undefined'. próba odczytania wartości niedokładnej zmiennej spowoduje wyrzucenie ReferenceError.)

nulljest subtelnie zepsuty, ponieważ typeof null == 'object'. Nie wiem, dlaczego mamy undefinedi nullprawdopodobnie jakiś historyczny wypadek.

Sean McMillan
źródło
2

Cóż, undefinedjest wartością wartownika uzyskaną przez oszacowanie czegoś, co nie jest zdefiniowane jako przeciwieństwo null, która jest dokładnie zdefiniowaną wartością, która nic nie reprezentuje .

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

Na przykład wartość zwracana przez funkcję, która nie definiuje wartości zwracanej, jest niezdefiniowana. Wartość właściwości niezdefiniowanej w obiekcie jest niezdefiniowana. Zwracana wartość instrukcji, która nie jest wyrażeniem, jest niezdefiniowana (chociaż nie zobaczysz tego inaczej niż w konsoli).
Prosimy pamiętać, że można utworzyć funkcję, jawnie powraca undefinedi może jednoznacznie określić właściwość z wartością undefinedna obiekcie, bo w końcu jest to poprawna wartość. Zrobiłbyś to, aby jawnie poinformować, że coś nie jest zdefiniowane .

Można myśleć o relacji undefinedi nulljako że pomiędzy NaNi 0.

back2dos
źródło
„Wartość zwracana przez funkcję, która nie definiuje wartości zwracanej, jest niezdefiniowana”, masz na myśli, że tak undefinedjest void?
Saeed Neamati,
@ Saeed: Niezupełnie. voidw JavaScript jest jednostronnym operatorem , który przyjmuje dowolny argument i zwraca wartość undefined .
back2dos