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.
undefined
i kiedy używaćnull