Pytanie Jak ustalić, czy zmienna ma wartość "undefined" lub "null"?


Jak określić, czy zmienna jest undefined lub null? Mój kod jest następujący:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  //DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

Ale jeśli to zrobię, interpreter JavaScript zatrzymuje wykonywanie.


1610
2018-04-15 18:12


pochodzenie


Czy możemy wyznaczyć to pytanie jako zamknięte? Nie mam wystarczającej liczby przedstawicieli. @tats_innit - Aerovistae
@Aerovistae tylko moderator <> diamond może ręcznie zablokować i odblokować wpis stackoverflow: meta.stackexchange.com/questions/22228/...  :) - Tats_innit


Odpowiedzi:


Możesz korzystać z zalet operator abstrakcyjnego równości Aby to zrobić:

if (variable == null){
    // your code here.
}

Bo null == undefined jest prawdą, powyższy kod złapie oba null i undefined.


2201
2018-04-15 18:14



if (typeof variable === 'undefined' || !variable) { /* do things */ }; to działa dla mnie - Ansd
@Abserwowane rozwiązanie nie dotyczy wyłącznie undefined lub null. !variable będzie prawdą dla każdej wartości falsyfikacji: '', 0, false, null, undefineditp. - Douglas Ludlow
Czy istnieje wyjaśnienie, dlaczego "==" działa, a "===" nie? Spojrzałem na edycję wątku w meta, ale nie rozumiem, dlaczego ta odpowiedź nie mogła skorzystać z wyjaśnienia, dlaczego "== "jest tu używane i jak to działa. - LucyMarieJ
Odpowiedziałem na własne pytanie. Przeprosiny. Znalazłem odpowiedź tutaj: stackoverflow.com/questions/5101948/...  Dla każdego, kto ma takie samo zamieszanie. - LucyMarieJ
Czy istnieje jakaś stara przeglądarka, w której może to zawieść? - donquixote


Standardowy sposób na złapanie null i undefined jednocześnie jest to:

if (variable == null) {
     // do something 
}

- co jest w 100% równoważne z bardziej wyraźnym, ale mniej zwięzłym:

if (variable === undefined || variable === null) {
     // do something 
}

Pisząc profesjonalny JS, przyjmuje się za pewnik, że [typ równości i zachowanie == vs ===] [1] jest zrozumiany. Dlatego używamy == i tylko porównać do null.


Edytuj ponownie

Komentarze sugerujące użycie typeof są po prostu źle. Tak, moje rozwiązanie powyżej spowoduje błąd ReferenceError, jeśli zmienna nie istnieje. To coś dobrego. Ten błąd ReferenceError jest pożądany: pomoże Ci znaleźć błędy i naprawić je przed wysłaniem kodu, podobnie jak błędy kompilatora w innych językach.

Nie powinieneś mieć żadnych odniesień do niezadeklarowanych zmiennych w twoim kodzie.


911
2018-01-22 03:01



Spowoduje to odwołanie ReferenceError i wykonanie przerwania, jeśli zmienna nie zostanie zdefiniowana lub nie będzie w ogóle przywoływana w kodzie, użycie typeof jest bezpieczniejsze. - Mani Gandham
To bardziej punkt stylistyczny. Jeśli zmienna nie została zadeklarowana w wszystko, to naprawdę po prostu złe pisanie ze strony autora. Powinieneś wiedzieć, czy zmienna została zadeklarowana, czy nie, to nie powinno być pytanie. Ale tak, jeśli dla jakiś powód w tym przypadku należy to zmienić na window.variable zamiast po prostu zmienna, które nie spowoduje błędu odniesienia. Należy unikać Typeof. - Aerovistae
Tak, ponieważ napisałeś !== zamiast !=. - Aerovistae
-OP: Oświadczenie o tym, że porównania są "w 100% ekwiwalentne" jest PO PROSTU NIEPRAWIDŁOWE, jak zauważyłeś we własnej EDYCJI, a drugie spowoduje błąd ReferenceError. Co do stwierdzenia: "Nie powinieneś mieć żadnych odniesień do niezadeklarowanych zmiennych w swoim kodzie." NAPRAWDĘ? Słyszałeś kiedyś o opcjonalnych parametrach? jsfiddle.net/3xnbxfsu - Timothy Kanski
@TymothyKanski opcjonalne parametry mogą być niezdefiniowane, jeśli opcjonalnie nie są dostarczane, ale są one definitywnie zadeklarowanymi zmiennymi. Są one zadeklarowane i mają wartość undefined, jak każda deklarowana, ale niezainicjowana zmienna, tj var someVar; więc twoja argumentacja tak naprawdę nie wytrzymuje - chiliNUT


if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

177
2018-04-15 18:25



Na wypadek, gdyby ktokolwiek myślał, że to kolejna połowa odpowiedzi, to faktycznie działa. undefined ocenia równe null. - Chuck
Nie powiodło mi się w konsoli chrome ... ReferenceError: zmienna nie jest zdefiniowana, więc może działać, ale nie dla mnie ... - Eran Medan
Działa tylko w przypadku zadeklarowanych zmiennych, a nie zmiennych, które mogą lub nie mogą być zadeklarowane, co rzadko ma miejsce. (W tym przypadku musisz użyć typeof + a null check)
Właśnie pojąć możesz dodać ten komentarz: /*jshint eqnull:true */ do początku dokumentu lub funkcji JS, a JSHint przestanie ostrzegać o swoich zastosowaniach == null. - Web_Designer
@Aerovistae możesz wskazać mi odniesienie, które wyraźnie stwierdza, że == Jest zepsuty. Przymus if(variable == null)w tej odpowiedzi ma dla mnie kompletny sens ... - Ben


Łącząc powyższe odpowiedzi, wydaje się, że najbardziej kompletna odpowiedź brzmi:

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

Powinno to działać dla każdej zmiennej, która jest niezadeklarowana lub zadeklarowana i jawnie ustawiona na wartość null lub undefined. Wyrażenie boolowskie powinno mieć wartość false dla dowolnej zadeklarowanej zmiennej, która ma rzeczywistą wartość inną niż null.


162
2017-10-11 17:02



@Aerovistae Rozumiem to typeof jest operatorem, a nie funkcją, więc nie potrzebuje nawiasów, ale doceniam nawiasy - po prostu dla czytelności. - user664833
a co z bezpośrednim sprawdzeniem, czy (zmienna === undefined) zamiast używania typeof? - Arjun U.
@ArjunU, który spowoduje błąd ReferenceError, jeśli zmienna nie jest zadeklarowana. Jeśli nie wiesz, czy zmienna jest zadeklarowana, skorzystaj z powyższego rozwiązania. Jeśli możesz zagwarantować, że zmienna jest co najmniej deklarowana, możesz użyć variable == null - Rogue
Jest to lepsze rozwiązanie, ponieważ jak zaznaczył @Rogue, zmienna może nie zostać zadeklarowana. - Abdul Sadik Yalcin
Popraw mnie, jeśli się mylę, ale czy nie jest to pierwszy warunkowy nadzbiór drugiego, a zatem drugi warunek jest zbędny? - March Ho


if (typeof EmpName != 'undefined' && EmpName) {

będzie wartość true, jeśli wartość nie jest:

  • zero

  • niezdefiniowany

  • NaN

  • pusta struna ("")

  • 0

  • fałszywy


75
2018-05-07 07:24



Myślę, że to niebezpieczna technika, która rozprzestrzeniła się jak dziki ogień. Ponieważ wiele sprawdzanych zmiennych może być wartością logiczną lub liczbami. Więc jeśli użytkownik nie rozumie w pełni konsekwencji, nie jest to dobre. - usefulBee
Proszę podać odniesienie do tej especification javascript - villamejia
To jest to samo if (EmpName). Jeśli to jest undefined będzie już falsy. - Rudy
Jeśli zmienna nie jest zdefiniowana. następnie, jeśli (EmpName) spowoduje błąd - Thamaraiselvam
@Thamaraiselvam Myślę, że Rudy mógł to oznaczać var EmpName; if (EmpName). Gdzie zdefiniowana jest zmienna, ale nie przypisano jej wartości. - hungerstar


jQuery attr() Funkcja zwraca pusty ciąg lub rzeczywistą wartość (i nigdy nie null lub undefined). Tylko czas wraca undefined jest, gdy twój selektor nie zwrócił żadnego elementu.

Więc możesz chcieć przetestować przeciwko pustemu napisowi. Alternatywnie, ponieważ puste ciągi, null i undefined to false-y, możesz po prostu zrobić to:

if (!EmpName) { //do something }

20
2018-04-15 18:20



Chrome 17,0.963,78 m daje ten błąd: ReferenceError: EmpName is not defined - Eran Medan
@EranMedan Wiem, że jest późno, ale mam nadzieję, że pomogę ludziom, którzy przyjdą tu później. Przyczyną błędu jest to, że nie został on w ogóle zadeklarowany. Zwykle będziesz miał EmpName (lub inną zmienną) przekazywany do funkcji lub zwracaną wartość innej funkcji, a zatem zadeklarowaną (Przykład: "var x;"). Aby przetestować, czy powróciło niezdefiniowane, null lub pusty ciąg, możesz użyć powyższego rozwiązania. - Dave


Podoba mi się to:

if (!!variable) {
   //do something
}

Łapie oba zero i niezdefiniowany


13
2017-09-16 08:35



!! zwraca false dla null lub undefined. Tak więc to, jeśli uruchomi się tylko, jeśli zmienna nie ma wartości NULL lub jest niezdefiniowana. - Dan
var d = 0; zawiedzie jako !!d ocenia na false - ainesophaur
To również "łapie" pusty ciąg, 0, NaN, i false. Całkowicie niepoprawna odpowiedź. - Aerovistae
Unieważniono, ponieważ ta odpowiedź zatruwa pulę wiedzy StackOverflow. - mickmackusa


Jeśli zmienna, którą chcesz sprawdzić, jest globalna, zrób

if (window.yourVarName) {
    // Your code here
}

Ten sposób sprawdzenia nie spowoduje błędu, nawet jeśli yourVarName zmienna nie istnieje.

Przykład: chcę się dowiedzieć, czy moja przeglądarka obsługuje interfejs History API

if (window.history) {
    history.back();
}

Jak to działa:

window to obiekt, który przechowuje wszystkie zmienne globalne jako swoje właściwości, a w JavaScript jest legalna próba uzyskania dostępu do nieistniejącej właściwości obiektu. Gdyby history nie istnieje wtedy window.history zwraca undefined. undefined jest falsey, więc kod w if(undefined){} blok nie działa.


9
2018-02-10 16:30



Czytelnicy powinni pamiętać, że takie podejście jest idiomatyczne do sprawdzania - od JavaScript działającego w przeglądarce - czy światowy zmienna została zadeklarowana, a zwłaszcza, czy dostępna jest globalna przeglądarka (taka jak interfejs API historii). To nie będzie działać do sprawdzania, czy nie jest zmienną globalną null lub undefined, ani nie będzie działać, jeśli JavaScript jest uruchomiony poza przeglądarką (np. w Node.js). Będzie również traktować globale jako ustawione 0, false lub '' takie same jak te, które są niezadeklarowane lub undefined lub null, co zwykle jest w porządku. - Mark Amery
Zakłada się, że skrypt działa w przeglądarce. To nie jest dane. - GreenAsJade


Przyszedłem napisać własną funkcję do tego ... javascript jest dziwny

Można go używać dosłownie. (Należy zauważyć, że sprawdza to również, czy zmienna zawiera jakąkolwiek możliwą do wykorzystania wartości. Ale ponieważ ta informacja jest zwykle potrzebna, myślę, że warto ją opublikować). Proszę rozważyć pozostawienie notatki.

function empty(v) {
        let type = typeof v;
        if(type === 'undefined') {
            return true;
        }
        if(type=== 'boolean') {
            return !v;
        }
        if(v === null) {
            return true;
        }
        if(v === undefined) {
            return true;
        }
        if(v instanceof Array) {
            if(v.length < 1) {
                return true;
            }
        }
        else if(type === 'string') {
            if(v.length < 1) {
                return true;
            }
            if(v==='0') {
                return true;
            }
        }
        else if(type === 'object') {
            if(Object.keys(v).length < 1) {
                return true;
            }
        }
        else if(type === 'number') {
            if(v===0) {
                return true;
            }
        }
        return false;
    }

Zgodny z czcionką.

edytować. ta funkcja powinna wystarczyć dokładnie to samo, co PHP empty()funkcjonować (widzieć RETURN VALUES)

Uważa undefined, null, false, 0, 0.0, "0"  {}, [] jako pusty.

"0.0", NaN, " ", true są uważane za niepuste.


7
2017-10-24 15:14



Wystąpił problem z małą wartością zerową. Chcę sprawdzić, czy przekazywany parametr ma wartość NULL, czy pusty obiekt { }. Jest to powszechny i ​​głupi problem językowy, ale zapomniałem o tym. Wszystkie moje wyszukiwania pokazują odpowiedzi na niezdefiniowaną wartość pustą lub luźne porównania równości (==), ale nie ścisłą równość (===) lub równoważną. A następnie tutaj w Twojej -1 rankowanej odpowiedzi na bardzo na dole strony (przed moim awansem) jest odpowiedzią, która mi umykała. Object.keys( obj ).length < 1 lub może === 0, zakładając, że nigdy nie będzie -1. W każdym razie, przegłosowano 0, woo. : p - user314159
Dzięki, mogłem upuścić tę funkcję i wyczyścić wiele kodu. Dlaczego nie jest to standardowa funkcja JS, jest poza mną. - Andy
Powinieneś się zmienić wszystko Twojego == do === tutaj, to byłoby rozsądną funkcją. - Ben McIntyre
@BenMcIntyre masz rację. Dzięki. - Blauhirn