Jestem trochę zdezorientowany, że JavaScript jest niezdefiniowany i zerowy.
Nie myl się null. Zasadniczo ma to sens i zachowuje się podobnie do innych pojęć w językach skryptowych obiektów pozapasmowych „zerowych”, „zerowych” lub „brakowych”.
undefinedz drugiej strony jest dziwnym dziwactwem JavaScript. Jest to obiekt singletonowy reprezentujący wartości poza pasmem, zasadniczo drugi podobny, ale inny null. Pojawia się:
Gdy wywołujesz funkcję z mniejszą liczbą argumentów niż lista argumentów na functionlistach instrukcji, argumenty niepasowane są ustawiane na undefined. Możesz to sprawdzić za pomocą np .:
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
Dzięki tej metodzie nie można odróżnić dosomething(1)i dosomething(1, undefined); arg2będzie w obu przypadkach taka sama. Jeśli chcesz powiedzieć różnicę, na którą możesz spojrzeć arguments.length, ale takie opcjonalne argumenty nie są ogólnie bardzo czytelne.
Gdy funkcja nie ma return value;, zwraca undefined. Zasadniczo nie ma potrzeby korzystania z takiego zwrotu.
Gdy deklarujesz zmienną, mając var ainstrukcję w bloku, ale jeszcze jej nie przypisałeś, to tak jest undefined. Znów nie powinieneś nigdy polegać na tym.
Upiorny typeofoperator powraca, 'undefined'gdy jego operand jest prostą zmienną, która nie istnieje, zamiast zgłaszania błędu, co normalnie by się zdarzyło, gdybyś próbował się do niego odwołać. (Możesz także nadać mu prostą zmienną owiniętą w nawiasy, ale nie pełne wyrażenie zawierające nieistniejącą zmienną.) Niewiele też do tego służy.
To jest kontrowersyjne. Kiedy uzyskujesz dostęp do właściwości obiektu, który nie istnieje, nie pojawia się od razu błąd, jak w każdym innym języku. Zamiast tego dostajesz undefinedprzedmiot. (A potem, gdy spróbujesz użyć tego undefinedobiektu w dalszej części skryptu, popełni błąd w dziwny sposób, który jest znacznie trudniejszy do wyśledzenia, niż gdyby JavaScript natychmiast wyrzucił błąd).
Jest to często używane do sprawdzania istnienia właściwości:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
Ponieważ jednak możesz przypisać undefineddowolną inną wartość:
o.prop= undefined;
nie wykrywa to, czy właściwość jest tam niezawodnie. Lepiej użyć inoperatora, który nie był w oryginalnej wersji JavaScript Netscape, ale jest teraz dostępny wszędzie:
if ('prop' in o)
...
Podsumowując, undefinedjest bałagan specyficzny dla JavaScript, który myli wszystkich. Oprócz opcjonalnych argumentów funkcji, w których JS nie ma bardziej eleganckiego mechanizmu, undefinednależy unikać. To nigdy nie powinno być częścią języka; nulldziałałoby dobrze dla (2) i (3), a (4) to błąd, który istnieje tylko dlatego, że na początku JavaScript nie miał wyjątków.
co if (!testvar)właściwie robi Czy testuje na niezdefiniowany i zerowy czy po prostu niezdefiniowany?
Taki „truthiness” test sprawdza przeciwko false, undefined, null, 0, NaNi puste struny. Ale w tym przypadku tak, to tak naprawdę undefineddotyczy. IMO, powinno to być bardziej jednoznaczne i powiedzieć if (testvar!==undefined).
po zdefiniowaniu zmiennej mogę wyczyścić ją z powrotem do niezdefiniowanej (a zatem usunąć zmienną).
Z pewnością możesz undefineddo niego przypisać , ale to nie spowoduje usunięcia zmiennej. Tylko delete object.propertyoperator naprawdę usuwa rzeczy.
deletejest naprawdę przeznaczony dla właściwości, a nie zmiennych jako takich. Przeglądarki pozwolą ci uciec prosto delete variable, ale nie jest to dobry pomysł i nie będzie działać w trybie ścisłym ECMAScript Piątej Edycji. Jeśli chcesz zwolnić odniesienie do czegoś, aby można je było zebrać w śmieciach, bardziej normalne byłoby powiedzenie variable= null.
czy mogę przekazać niezdefiniowany parametr?
Tak.