Jestem trochę zdezorientowany co do JavaScript undefined
i null
wartości.
Co if (!testvar)
właściwie robi? Czy testuje undefined
i null
czy tylko undefined
?
Czy po zdefiniowaniu zmiennej mogę ją wyczyścić ponownie undefined
(a zatem usunąć zmienną)?
Czy mogę przekazać undefined
jako parametr? Na przykład:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
Odpowiedzi:
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 innynull
. Pojawia się:Gdy wywołujesz funkcję z mniejszą liczbą argumentów niż lista argumentów na
function
listach instrukcji, argumenty niepasowane są ustawiane naundefined
. Możesz to sprawdzić za pomocą np .:Dzięki tej metodzie nie można odróżnić
dosomething(1)
idosomething(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;
, zwracaundefined
. 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 jestundefined
. 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ć tegoundefined
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:
Ponieważ jednak możesz przypisać
undefined
dowolną inną wartość: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: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.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)
.Z pewnością możesz
undefined
do niego przypisać , ale to nie spowoduje usunięcia zmiennej. Tylkodelete 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 prostodelete 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 powiedzenievariable= null
.Tak.
źródło
undefined
jest obiektem singletonowym? Co masz na myśli? To prymitywna wartość, a nie obiekt.typeof foo=='undefined'
; zwykle używa się go do (4a) globalnego wąchania, w którym to przypadku wolałbym być jawnym i powiedzieć'foo' in window
, lub (4b) testowania względemundefined
samej wartości, w którym to przypadku wolałbym być czytelny i powiedziećfoo===undefined
. Teoretycznie testowanietypeof
przeciwko'undefined'
może mieć przypadek użycia, którego inne konstrukty nie mogłyby zapewnić: wąchanie istnienia zmiennych lokalnych. Jednak w rzeczywistości prawie zawsze wiesz, jakie zmienne są deklarowane jako lokalne.return
instrukcji zwracaundefined
, ale jeśli funkcja jest konstruktorem (wywołana przeznew
operatora), zwróci nowy obiekt (wartośćthis
wewnątrz konstruktora), mimo że nie mareturn
instrukcji.console.log((function (){}()));
zwracaundefined
.console.log((new function (){}()));
zwraca obiekt.Nie możesz (nie powinieneś?) Definiować czegokolwiek jako niezdefiniowanego, ponieważ zmienna nie byłaby już niezdefiniowana - po prostu ją zdefiniowałeś .
Nie możesz (nie powinieneś?) Przejść
undefined
do funkcji. Jeśli chcesz przekazać pustą wartość, użyjnull
zamiast tego.Instrukcja
if(!testvar)
sprawdza logiczne wartości prawda / fałsz, ta konkretna sprawdza, czytestvar
oceniafalse
. Z definicji,null
aundefined
nie powinny być oceniane jako anitrue
czyfalse
, ale analizuje schemat JavaScriptnull
jakfalse
i daje błąd, jeśli starają się ocenić niezdefiniowanej zmiennej.Aby poprawnie przetestować
undefined
lubnull
użyj:źródło
==
i!=
).var a= undefined
. Możesz przejśćfn(undefined)
. Jeśli chcesz znaleźć różnicę między niezdefiniowaną właściwościąp
obiektuo
, a właściwościąp
, która zdefiniowała i ustawiła wartośćundefined
, musisz użyć'p' in o
operatora.testvar === undefined
zamiast bardziej skomplikowanychtypeof(testvar) === "undefined"
?typeof
testu dla niezdefiniowanych zmiennych: w przeciwieństwie do tegonull
,undefined
jest po prostu własnością obiektu globalnego i może zostać ponownie zdefiniowany. Wymaga tylko określonego stylu kodowania i brakującego znaku równości iundefined
jest cicho zmieniany:if (undefined = someVar) {...}
undefined
niezmienną właściwość obiektu globalnego, dzięki czemu jest bezpieczniejszy niż kiedyś. Jednak nadal można zdefiniować zmienną zmienną wywoływanąundefined
w funkcji, więc problem nie zniknął całkowicie.Podstawową różnicą jest to, że
undefined
inull
reprezentują różne koncepcje.Gdyby tylko
null
był dostępny, nie byłbyś w stanie ustalić, czynull
został ustawiony celowo jako wartość, czy też wartość nie została jeszcze ustawiona, chyba że użyjesz kłopotliwego wychwytywania błędów: np.Jeśli jednak celowo ustawisz wartość na
null
, ścisła równość zundefined
nieudanymi, umożliwiając w ten sposób rozróżnienie między wartościaminull
iundefined
wartościami:Sprawdź tutaj referencje zamiast polegać na tym, że ludzie lekceważąco mówią śmieci: „Podsumowując, niezdefiniowany jest bałagan specyficzny dla JavaScript, który myli wszystkich”. To, że jesteś zdezorientowany, nie oznacza, że jest to bałagan.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
Takie zachowanie nie jest specyficzna dla JavaScript i uzupełnia uogólnionego pojęcia, że wynik może być logiczna
true
,false
, nieznane (null
), bez wartości (undefined
), czy coś poszło nie tak (error
).http://en.wikipedia.org/wiki/Undefined_value
źródło
null
działałoby dobrze.a == null
jest totrue
spowodowane przymusem typu Javascript.Najlepszym sposobem sprawdzenia wartości null jest
i dla niezdefiniowanych
Możesz przypisać zmienną z niezdefiniowanym.
źródło
!==
, a nie!=
TAK, możesz, ponieważ niezdefiniowany jest zdefiniowany jako niezdefiniowany.
Twój przypadek:
możesz również utworzyć własną niezdefiniowaną zmienną:
źródło
Aby odpowiedzieć na twoje pierwsze pytanie, operator not (
!
) wymusi wszystko, co zostanie podane, na wartość boolowską. Więcnull
,0
,false
,NaN
i""
(pusty ciąg znaków) będzie wszystko pojawiać fałszywe.źródło
undefined
nie pojawi się jakofalse
, spowoduje wygenerowanie błędu „nie zdefiniowano”.if (undefined) {/* Do stuff*/}
nie da błędu, ponieważundefined
istnieje jako właściwość obiektu globalnego. To, co da błąd, to coś w styluif (someUndeclaredVariable) {/* Do stuff*/}
JavaScript, jak ustawić zmienną niezdefiniowaną w wierszu poleceń:
Ustaw zmienną na niezdefiniowaną w
js
terminalu linii poleceń javascript, który jest dostarczany z Javą w Ubuntu 12.10.Jeśli ustawisz zmienną na niezdefiniowaną w javascript:
Umieść to w myjs.html:
Drukuje to:
OSTRZEŻENIE! Ustawiając zmienną na niezdefiniowaną, ustawiasz zmienną na inną zmienną. Jeśli jakaś podstępna osoba biegnie,
undefined = 'rm -rf /';
to ilekroć ustawisz zmienną na niezdefiniowaną, otrzymasz tę wartość.Być może zastanawiasz się, w jaki sposób mogę wyprowadzić obcych o nieokreślonej wartości na początku i nadal działać. Jest to spowodowane podnoszeniem skryptów javascript: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
źródło
Spróbuj tego:
źródło
For
if (something)
iif (!something)
jest powszechnie używane do sprawdzania, czy coś jest zdefiniowane czy nie zdefiniowane. Na przykład:Identyfikator jest konwertowany na wartość logiczną, więc
undefined
jest interpretowany jakofalse
. Istnieją oczywiście inne wartości (takie jak 0 i „”), które również są interpretowane jakofalse
, ale albo identyfikator nie powinien rozsądnie mieć takiej wartości, albo jesteś zadowolony z traktowania takiej wartości tak samo, jak niezdefiniowana.JavaScript ma
delete
operator, którego można użyć do usunięcia członka obiektu. W zależności od zakresu zmiennej (tj. Czy jest ona globalna czy nie), możesz ją usunąć, aby stała się niezdefiniowana.Nie ma
undefined
słowa kluczowego, którego można by użyć jako niezdefiniowanego literału. Możesz pominąć parametry w wywołaniu funkcji, aby uczynić je niezdefiniowanymi, ale można tego użyć tylko poprzez przesłanie mniejszej liczby parametrów do funkcji, nie można pominąć parametru w środku.źródło
Dla zabawy, oto dość bezpieczny sposób przypisywania zmiennej „nieprzypisany”. Aby doszło do kolizji, ktoś musiałby dodać do prototypu obiektu o dokładnie takiej samej nazwie jak losowo wygenerowany ciąg. Jestem pewien, że generator losowych ciągów mógłby zostać ulepszony, ale właśnie wziąłem jeden z tego pytania: Wygeneruj losowy ciąg / znaki w JavaScript
Działa to poprzez utworzenie nowego obiektu i próbę uzyskania dostępu do właściwości z losowo wygenerowaną nazwą, która, jak zakładamy, nie będzie istnieć, a zatem będzie miała wartość niezdefiniowaną.
źródło