Jak sprawdzić zmienną undefined lub null w JavaScript?

Często używamy następującego wzoru kodu w naszym kodzie JavaScript

if (typeof(some_variable) != 'undefined' && some_variable != null)
{
    // Do something with some_variable
}

Czy istnieje mniej gadatliwy sposób sprawdzania, który ma ten sam efekt?

Według niektórych forów i literatury mówiących po prostu następujące powinny mieć taki sam efekt.

if (some_variable)
{
    // Do something with some_variable
}

Niestety, Firebug ocenia takie polecenie jako error w runtime, gdy some_variable jest niezdefiniowany, podczas gdy pierwsza jest dla niego odpowiednia. Czy jest to tylko (niechciane) zachowanie Firebug czy jest naprawdę jest jakaś różnica między tymi dwoma sposobami?

Author: Peter Mortensen, 2010-04-01

15 answers

Trzeba rozróżnić dwa przypadki:

  1. Nieokreślone zmienne , Jak foo. Pojawi się błąd, jeśli uzyskasz dostęp do niezdefiniowanej zmiennej w dowolnym kontekście innym niż typeof.

    if(typeof someUndefVar == whatever) // works
    
    if(someUndefVar) // throws error  
    

    Tak więc, dla zmiennych, sprawdzanie typeof jest koniecznością. Z drugiej strony jest to tylko rzadko potrzebne - zazwyczaj wiesz czy Twoje zmienne są zdefiniowane, czy nie.

  2. Undefined properties, like someExistingObj.someUndefProperty. Niezdefiniowana właściwość nie generuje błąd i po prostu zwraca undefined, który po przekonwertowaniu na wartość logiczną, ewaluuje do false. Więc, jeśli nie zależy ci na 0 i false, użycie if(obj.undefProp) jest ok. Istnieje wspólny idiom oparty na tym fakcie:

    value = obj.prop || defaultValue
    

    Co oznacza " Jeśli obj ma właściwość prop, przypisz ją do value, w przeciwnym razie przypisz wartość domyślną defautValue".

    Niektórzy uważają to zachowanie za mylące, argumentując, że prowadzi to do trudnych do znalezienia błędów i zalecają użycie in operator zamiast

    value = ('prop' in obj) ? obj.prop : defaultValue
    
 285
Author: user187291,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 20:58:52

Myślę, że najskuteczniejszym sposobem na sprawdzenie "wartość to null lub undefined" jest

if ( some_variable == null ){
  // some_variable is either null or undefined
}

Więc te dwie linie są równoważne:

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}

Uwaga 1

Jak wspomniano w pytaniu, krótki wariant wymaga zadeklarowania some_variable, w przeciwnym razie zostanie wyrzucony ReferenceError. Jednak w wielu przypadkach można założyć, że jest to bezpieczne:

Sprawdź opcjonalne argumenty:

function(foo){
    if( foo == null ) {...}

Sprawdź właściwości na istniejącym obiekt

if(my_obj.foo == null) {...}

Z drugiej strony typeof może radzić sobie z nierejestrowanymi zmiennymi globalnymi (po prostu zwraca undefined). Jak wyjaśnił Alsciende, przypadki te należy jednak ograniczyć do minimum z dobrych powodów.

Uwaga 2

Ten - jeszcze krótszy - wariant jestnie odpowiednikiem:

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}

Więc

if ( some_variable ) {
  // we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}

Uwaga 3

Ogólnie zaleca się stosowanie === zamiast ==. Proponowane rozwiązanie stanowi wyjątek od tej zasada. Sprawdzanie składni jshint zapewnia nawet opcję eqnull z tego powodu.

Z jQuery style guide :

Ścisłe sprawdzanie równości ( = = = ) powinno być stosowane na korzyść==. Jedyny wyjątkiem jest sprawdzanie undefined I null za pomocą null.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;
 311
Author: mar10,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-28 13:45:42

Sprawdzenie null z normalną równością zwróci również true dla undefined.

if (window.variable == null) alert('variable is null or undefined');

Równość JS

 34
Author: Semra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-21 12:07:17

W nowszych standardach JavaScript, takich jak ES5 i ES6, można po prostu powiedzieć

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false

All zwraca false, co jest podobne do sprawdzania pustych zmiennych w Pythonie. Więc jeśli chcesz napisać logikę warunkową wokół zmiennej, po prostu powiedz

if (Boolean(myvar)){
   // Do something
}

Tutaj "null" lub "empty string" lub "undefined" będą obsługiwane efektywnie.

 21
Author: Naren Yellavula,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-29 12:01:15

Jeśli spróbujesz odwołać się do nierejestrowanej zmiennej, błąd zostanie wyrzucony we wszystkich implementacjach JavaScript.

Właściwości obiektów nie podlegają tym samym warunkom. Jeśli właściwość obiektu nie została zdefiniowana, błąd nie zostanie wyświetlony, jeśli spróbujesz uzyskać do niej dostęp. Więc w tej sytuacji można skrócić:

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

Do

if (myObj.some_property != null)

Mając to na uwadze, oraz fakt, że zmienne globalne są dostępne jako właściwości obiektu globalnego (window w przypadku przeglądarki), możesz użyć następujących zmiennych globalnych:

if (window.some_variable != null) {
    // Do something with some_variable
}

W lokalnych zakresach zawsze warto upewnić się, że zmienne są zadeklarowane u góry bloku kodu, co pozwoli zaoszczędzić na powtarzających się używaniach typeof.

 18
Author: Andy E,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-26 11:40:24

Najpierw musisz być bardzo jasny co testujesz. JavaScript ma wszelkiego rodzaju ukryte konwersje, aby cię zaskoczyć, i dwa różne typy porównywania równości: == i ===.

Funkcja, test(val), która sprawdza dla null lub undefined powinna mieć następujące cechy:

 test(null)         => true
 test(undefined)    => true
 test(0)            => false
 test(1)            => false
 test(true)         => false
 test(false)        => false
 test('s')          => false
 test([])           => false

Zobaczmy, który z pomysłów tutaj rzeczywiście przejść nasz test.

Te prace:

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null

Te nie działają:

typeof(val) === 'undefined'
!!val

Stworzyłem wpis jsperf do porównaj poprawność i wydajność tych podejść. Wyniki są na razie niejednoznaczne, ponieważ nie ma wystarczającej liczby uruchomień w różnych przeglądarkach / platformach. Poświęć chwilę na uruchomienie testu na swoim komputerze!

Obecnie wydaje się, że prosty val == null test daje najlepsze wyniki. Jest też prawie Najkrótsza. Test może zostać zanegowany do val != null, Jeśli chcesz dopełnienia.

 13
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-27 12:48:22

Ponieważ nie ma jednej kompletnej i poprawnej odpowiedzi, postaram się podsumować:

Ogólnie wyrażenie:

if (typeof(variable) != "undefined" && variable != null)

Nie można uprościć, ponieważ variable może być niezgłoszona, więc pominięcie {[5] } spowodowałoby ReferenceError. Ale można uprościć wyrażenie zgodnie z kontekstem :

Jeśli variable jest globalnym , można uprościć do:

if (window.variable != null)

Jeśli jest to local, prawdopodobnie można uniknąć sytuacji, gdy ta zmienna jest nierejestrowane, a także uprościć do:

if (variable != null)

Jeśli jest to właściwość obiektu, nie musisz się martwić ReferenceError:

if (obj.property != null)
 4
Author: TMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-28 19:44:30

Możesz po prostu sprawdzić, czy zmienna ma wartość, czy nie. Znaczenie,

if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false

}

Jeśli nie wiesz, czy zmienna istnieje (to znaczy, jeśli została zadeklarowana), powinieneś sprawdzić za pomocą operatora typeof. np.

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}
 4
Author: DDave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-09 04:32:02

Jak wspomniano w jednej z odpowiedzi, możesz mieć szczęście, jeśli mówisz o zmiennej, która ma zasięg globalny. Jak zapewne wiesz, zmienne definiowane globalnie zwykle są dodawane do obiektu windows. Możesz skorzystać z tego faktu, więc powiedzmy, że uzyskujesz dostęp do zmiennej o nazwie bleh, wystarczy użyć operatora double inverted (!!)

!!window['bleh'];

Zwróci false, gdy bleh nie zostanie zadeklarowana i nie zostanie przypisana wartość.

 3
Author: Farax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-17 01:27:47

Cokolwiek yyy jest niezdefiniowane lub null, zwróci true

if (typeof yyy == 'undefined' || !yyy) {
    console.log('yes');
} else {
    console.log('no');
}

Tak

if (!(typeof yyy == 'undefined' || !yyy)) {
    console.log('yes');
} else {
    console.log('no');
}

Nie

 2
Author: Terry Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-19 08:31:17

Otwórz Narzędzia programistyczne w swojej przeglądarce i po prostu wypróbuj kod pokazany na poniższym obrazku.

Img1 Img2

 1
Author: Akash Preet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-27 18:01:33

Testowanie nullity (if (value == null)) lub non-nullity (if (value != null)) jest mniej słowne niż testowanie statusu definicji zmiennej.

Ponadto testowanie if (value) (lub if( obj.property)) w celu upewnienia się, że istnieje zmienna (lub właściwość obiektu) nie powiedzie się, jeśli jest zdefiniowana wartością logiczną false. Caveat emptor:)

 0
Author: lucsorel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-25 09:03:13

Obie wartości można łatwo odróżnić za pomocą ścisłego operatora porównania:

Przykład pracy w:

Http://www.thesstech.com/tryme?filename=nullandundefined

Przykładowy Kod:

function compare(){
    var a = null; //variable assigned null value
    var b;  // undefined
    if (a === b){
        document.write("a and b have same datatype.");
    }
    else{
        document.write("a and b have different datatype.");
    }   
}
 0
Author: Sohail Arif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-23 22:11:27

Aby zrozumieć, przeanalizujmy, jaka będzie wartość zwracana przez silnik Javascript podczas konwersji undefined, null i "(również pusty łańcuch). Możesz sprawdzić to samo bezpośrednio na konsoli dewelopera.

Tutaj wpisz opis obrazka

Widać, że wszystkie konwertują na false, czyli wszystkie te trzy zakładają "brak istnienia" przez javascript. Więc nie musisz wyraźnie sprawdzać wszystkich trzech w kodzie, jak poniżej.

if (a === undefined || a === null || a==='') {
    console.log("Nothing");
} else {
    console.log("Something");
}

Chcę również zwrócić uwagę na jeszcze jedną thing

Jaki będzie wynik Boolean (0)?

Oczywiście false. Spowoduje to powstanie błędu w kodzie, gdy 0 stanie się poprawną wartością oczekiwanego wyniku. Więc upewnij się, że ta rzecz również podczas pisania kodu

 0
Author: JameelM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-16 03:04:32

Musisz zdefiniować funkcję tej postaci:

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}
 -1
Author: ljofre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-09 10:29:33