Jak sprawdzić nie zdefiniowaną zmienną w JavaScript

Chciałem sprawdzić czy zmienna jest zdefiniowana czy nie. Na przykład, poniższy błąd wyrzuca nie zdefiniowany błąd

alert( x );

Jak mogę złapać ten błąd?

Author: Josh Crozier, 2009-05-13

14 answers

W JavaScript, null jest obiektem. Jest inna wartość dla rzeczy, które nie istnieją, undefined. DOM zwraca null w prawie wszystkich przypadkach, gdy nie znajduje jakiejś struktury w dokumencie, ale w samym JavaScript undefined jest wartością używaną.

Po drugie, Nie, Nie ma bezpośredniego odpowiednika. Jeśli naprawdę chcesz sprawdzić specjalnie dla null, wykonaj:
if (yourvar === null) // Does not execute if yourvar is `undefined`

Jeśli chcesz sprawdzić, czy zmienna istnieje, można to zrobić tylko za pomocą try/catch, ponieważ typeof będzie traktował zmienna niezgłoszona i zmienna zadeklarowana o wartości undefined jako równoważne.

Ale, aby sprawdzić, czy zmienna jest zadeklarowana i nie jest undefined:

if (yourvar !== undefined) // Any scope

Wcześniej konieczne było użycie operatora typeof, aby bezpiecznie sprawdzić undefined, ponieważ możliwe było ponowne przypisanie undefined tak jak zmienna. Stary sposób wyglądał tak:

if (typeof yourvar !== 'undefined') // Any scope

Problem ponownego przypisania undefined został naprawiony w ECMAScript 5, który został wydany w 2009 roku. Teraz możesz bezpiecznie używać === i !== do testowania na undefined bez używania typeof, ponieważ undefined jest tylko do odczytu przez jakiś czas.

Jeśli chcesz wiedzieć, czy członek istnieje niezależnie, ale nie obchodzi go, jaka jest jego wartość:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

Jeśli chcesz wiedzieć, czy zmienna jest prawdziwa :

if (yourvar)

Źródło

 1728
Author: Natrium,
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
2020-03-27 06:10:14

Jedynym sposobem, aby naprawdę sprawdzić, czy zmienna jest undefined, jest wykonanie następujących czynności. Pamiętaj, że undefined jest obiektem w JavaScript.

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

Niektóre z innych rozwiązań w tym wątku doprowadzą cię do przekonania, że zmienna jest niezdefiniowana, mimo że została zdefiniowana (np. z wartością NULL lub 0).

 361
Author: Michael Wales,
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-23 13:44:03

Technicznie, właściwe rozwiązanie jest (wierzę):

typeof x === "undefined"

Czasami można się leniwie i używać

x == null

Ale to pozwala zarówno niezdefiniowanej zmiennej x, jak i zmiennej x zawierającej null, zwracać true.

 67
Author: Jason S,
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-23 13:42:43

Jeszcze łatwiejszą i bardziej skróconą wersją byłoby:

if (!x) {
   //Undefined
}

Lub

if (typeof x !== "undefined") {
    //Do something since x is defined.
}
 18
Author: Dmitri Farkov,
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-23 13:43:39

Często robiłem:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}
 16
Author: Joe,
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-24 04:18:46

The void operator zwraca undefined dla dowolnego argumentu/wyrażenia przekazanego do niego. możesz więc przetestować wynik (w rzeczywistości niektóre minifiery zmieniają kod z undefined na void 0, Aby zapisać kilka znaków)

Na przykład:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}
 5
Author: svarog,
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-02 14:07:23

Innym potencjalnym "rozwiązaniem" jest użycie obiektu window. Pozwala uniknąć problemu błędu odniesienia w przeglądarce.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}
 3
Author: ubershmekel,
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-11-13 20:16:31

Błąd mówi ci, że x Nawet nie istnieje! Nie została zadeklarowana , co różni się od tego, że przypisano wartość.

var x; // declaration
x = 2; // assignment

Jeśli zadeklarujesz x, nie dostaniesz błędu. Otrzymasz alert z napisem undefined, Ponieważ x istnieje/został zadeklarowany, ale nie przypisano mu wartości.

Aby sprawdzić, czy zmienna została zadeklarowana, możesz użyć typeof, każda inna metoda sprawdzania, czy zmienna istnieje, spowoduje ten sam błąd na początku.

if(typeof x  !==  "undefined") {
    alert(x);
}

Sprawdza typ wartości przechowywanej w x. Zwróci undefined tylko wtedy, gdy xnie zostało zadeklarowane lub jeśli zostało zadeklarowane i nie zostało jeszcze przypisane.

 3
Author: JBallin,
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-04-16 09:09:03

Można również użyć trójdzielnego operatora warunkowego:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);
 2
Author: John,
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-02-12 21:37:26

Często używam najprostszego sposobu:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

EDIT:

Bez inicjalizacji zmiennej zostanie wyrzucony wyjątek "Uncaught ReferenceError: zmienna nie jest zdefiniowana..."

 2
Author: mokiSRB,
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-02-03 19:06:25

Po prostu zrób coś takiego jak poniżej:

function isNotDefined(value) {
  return typeof value === "undefined";
}

I nazwij to tak:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false
 2
Author: Alireza,
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
2019-01-31 12:08:03

Możemy sprawdzić undefined w następujący sposób

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}
 1
Author: Arshid KV,
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-07-04 17:17:18

Przyjęta odpowiedź jest prawidłowa. Chciałem tylko dodać jeszcze jedną opcję. Możesz również użyć try ... catch block, aby poradzić sobie z tą sytuacją. Dziwaczny przykład:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

Bądź świadomy catch bloku, który jest nieco bałagan, ponieważ tworzy Zakres na poziomie bloku. I oczywiście przykład jest niezwykle uproszczony, aby odpowiedzieć na zadane pytanie, nie obejmuje najlepszych praktyk w obsłudze błędów ;).

 0
Author: Евгений Савичев,
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-08-11 17:25:00

Używam małej funkcji, aby zweryfikować zadeklarowaną zmienną, co naprawdę zmniejsza ilość bałaganu w moich plikach javascript. Dodaję sprawdzenie wartości, aby upewnić się, że zmienna nie tylko istnieje, ale również została przypisana wartość. Drugi warunek sprawdza, czy zmienna również została utworzona, ponieważ jeśli zmienna została zdefiniowana, ale nie powstała (zobacz przykład poniżej), nadal będzie wyświetlać błąd, jeśli spróbujesz odwołać się do jej wartości w kodzie.

Nie utworzono instancji - var my_variable; Utworzono instancję - var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

Możesz następnie użyć instrukcji warunkowej, aby sprawdzić, czy zmienna została zarówno zdefiniowana, jak i utworzona w ten sposób...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

Lub sprawdzić, czy nie zostało zdefiniowane i utworzone użycie...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
 0
Author: MistyDawn,
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-05 18:09:04