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”.
undefined
z 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 function
listach 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)
; arg2
bę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 a
instrukcję w bloku, ale jeszcze jej nie przypisałeś, to tak jest undefined
. Znów nie powinieneś nigdy polegać na tym.
Upiorny typeof
operator 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 undefined
przedmiot. (A potem, gdy spróbujesz użyć tego undefined
obiektu 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ć undefined
dowolną inną wartość:
o.prop= undefined;
nie wykrywa to, czy właściwość jest tam niezawodnie. Lepiej użyć in
operatora, który nie był w oryginalnej wersji JavaScript Netscape, ale jest teraz dostępny wszędzie:
if ('prop' in o)
...
Podsumowując, undefined
jest bałagan specyficzny dla JavaScript, który myli wszystkich. Oprócz opcjonalnych argumentów funkcji, w których JS nie ma bardziej eleganckiego mechanizmu, undefined
należy unikać. To nigdy nie powinno być częścią języka; null
dział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
, NaN
i puste struny. Ale w tym przypadku tak, to tak naprawdę undefined
dotyczy. 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 undefined
do niego przypisać , ale to nie spowoduje usunięcia zmiennej. Tylko delete object.property
operator naprawdę usuwa rzeczy.
delete
jest 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.