Cum se verifică o variabilă nedefinită în JavaScript (Programare, Javascript, Variabile, Nedefinit)

Jineesh a intrebat.

Am vrut să verific dacă variabila este definită sau nu. De exemplu, următorul lucru aruncă o eroare de tip „not-defined”.

alert( x );

Cum pot să prind această eroare?

Comentarii

  • http://stackoverflow.com/questions/519145/how-to-check-whether-a-javascript-variable-defined/519157#519157 –  > Por jim0thy.
  • Se pare că acesta este un bunicuț: stackoverflow.com/questions/1485840/… stackoverflow.com/questions/2647867/… – great gramps maybe this: stackoverflow.com/questions/27509/… – –  > Por random.
  • Acesta nu este un duplicat al duplicatului marcat. Rezoluția variabilelor și rezoluția proprietăților obiectului sunt lucruri foarte diferite. Un duplicat mai bun este cum să verificați dacă o variabilă există în javascript?. –  > Por RobG.
  • Eroarea dvs. se datorează faptului că variabila nu a fost declarată. Cele mai multe răspunsuri se concentrează pe atribuire. Consultați răspunsul meu pentru mai multe informații. În plus, multe dintre ele afirmă incorect că null și undefined sunt obiecte în JavaScript. Acestea sunt primitive, , nu obiecte… –  > Por JBallin.
14 răspunsuri
Natrium

În JavaScript, null este un obiect. Există o altă valoare pentru lucrurile care nu există, undefined. DOM returnează null pentru aproape toate cazurile în care nu reușește să găsească o structură în document, dar în JavaScript însuși undefined este valoarea utilizată.

În al doilea rând, nu, nu există un echivalent direct. Dacă doriți cu adevărat să verificați în mod specific pentru null, , faceți-o:

if (yourvar === null) // Does not execute if yourvar is `undefined`

Dacă doriți să verificați dacă o variabilă există, acest lucru se poate face numai cu try/catch, , deoarece typeof va trata o variabilă nedeclarată și o variabilă declarată cu valoarea de undefined ca fiind echivalente.

Dar, pentru a verifica dacă o variabilă este declarată și nu este undefined:

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

Anterior, era necesar să se utilizeze funcția typeof pentru a verifica dacă o variabilă este nedefinită în siguranță, deoarece era posibil să se realoce undefined la fel ca o variabilă. Vechea metodă arăta astfel:

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

Problema de undefined fiind realocabilă a fost rezolvată în ECMAScript 5, care a fost lansat în 2009. Acum puteți utiliza în siguranță === și !== pentru a testa pentru undefined fără a utiliza typeof ca undefined a fost de ceva timp numai pentru citire.

Dacă doriți să știți dacă un membru există independent, dar nu vă interesează care este valoarea sa:

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

Dacă doriți să știți dacă o variabilă este veridică:

if (yourvar)

Sursa

Comentarii

    71

  • undefined nu este un cuvânt rezervat; dumneavoastră (sau codul altcuiva) puteți face „undefined = 3” și acest lucru va întrerupe două dintre testele dumneavoastră. –  > Por Jason S.
  • „Dacă știi că variabila există, dar nu știi dacă există vreo valoare stocată în ea” – huh?! –  > Por Jason S.
  • 37

  • Cred că se referă la o variabilă declarată care nu a fost atribuită. ex: var foo; // foo există, dar nu are o valoare –  > Por Wally Lawless.
  • Hmmm… Tocmai am observat linkul „sursă”: toată această postare este un citat direct dintr-o listă de discuții, & probabil că ar trebui editată pentru a face acest lucru mai clar, deoarece autorul original nu este disponibil pentru a clarifica. –  > Por Jason S.
  • „În JavaScript null este un obiect.”, acest lucru nu este de fapt adevărat și, probabil, vinovatul pentru această concepție greșită este typeof operator (typeof null == 'object'). Pe null valoare este un valoare primitivă, , care este singura valoare a clasei tip Null. –  > Por Christian C. Salvadó.
Michael Wales

Singura modalitate de a testa cu adevărat dacă o variabilă este undefined este de a face următoarele. Nu uitați, undefined este un obiect în JavaScript.

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

Unele dintre celelalte soluții din acest fir de discuție vă vor face să credeți că o variabilă este nedefinită, chiar dacă a fost definită (cu o valoare de NULL sau 0, de exemplu).

Comentarii

    18

  • Deoarece întrebarea era IS NOT UNDEFINED aici ar trebui să fie typeof someVar !== ‘undefined’, nu? –  > Por eomeroff.
  • Într-adevăr, nu cred că așa ceva, undefinded este un obiect, verificați mai întâi documentația developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures –  > Por Nicramus.
  • Singurul test care nu produce un ReferenceError. –  > Por Nostalg.io.
  • Acest cod este corect, dar cred că spunând undefined este un obiect în javascript este o dezinformare. Are această afirmație legătură cu răspunsul tău oricum? Este o valoare undefined de tip undefined, , atribuită identificatorului global numit undefined. –  > Por SimplGy.
  • Acest lucru este acum incorect în ceea ce privește faptul că este singura modalitate. undefined a fost readonly din ES5. Puteți testa în siguranță dacă este nedefinit folosind if (x === undefined) {...} sau folosind o prescurtare ca aceasta: if (x === void 0). –  > Por Stephen M Irving.
Jason S

Din punct de vedere tehnic, soluția corectă este (cred):

typeof x === "undefined"

Uneori puteți fi leneș și să folosiți

x == null

dar acest lucru permite ca atât o variabilă nedefinită x, cât și o variabilă x care conține null, să returneze true.

Comentarii

  • Dacă tastați var x; și apoi typeof x; veți obține "undefined" la fel ca în cazul în care ați scrie typeof lakjdflkdsjflsj; –  > Por Muhammad Umer.
  • Deci, nu există nicio modalitate de a verifica dacă există o variabilă nedefinită, dar declarată? –  > Por Muhammad Umer.
  • Nu cred; nu sunt sigur de ce ați vrea să o faceți. –  > Por Jason S.
  • ujndefined nu ar trebui să fie între apice –  > Por LowFieldTheory.
  • ce vrei să spui prin apice? –  > Por Jason S.
Dmitri Farkov

O versiune și mai simplă și mai prescurtată ar fi:

if (!x) {
   //Undefined
}

OR

if (typeof x !== "undefined") {
    //Do something since x is defined.
}

Comentarii

    27

  • prima piesă de cod poate fi incorectă dacă x este setat dintr-un apel de funcție. de exemplu x = A(); dacă A nu returnează nimic, va returna implicit „nedefinit”. Efectuând un !x ar fi adevărat, ceea ce ar fi corect din punct de vedere logic. Cu toate acestea, dacă A() returnează 0, atunci !x ar trebui să fie fals, deoarece x=0. Cu toate acestea, în JS, !0 este, de asemenea, adevărat. –  > Por Rajat.
  • cel de-al doilea cod poate fi prescurtat astfel: if(!typeof(XX)){ … }else{ … } –  > Por Alejandro Silva.
  • @AlejandroSilva Scuze pentru răspunsul întârziat. Asta nu va funcționa deoarece typeof returnează un șir de caractere, deci va returna ‘undefined’ pentru o variabilă nedefinită, care la rândul său va fi evaluată ca TRUE, ceea ce va duce la un fals pozitiv al unei variabile definite. –  > Por Dmitri Farkov.
  • Vă rugăm să scăpați de primul fragment, este pur și simplu rău –  > Por Juan Mendes.
  • Alte comentarii au subliniat că primul exemplu este rău, dar nu au indicat clar de ce. Așadar, pentru orice programator nou: !x nu testează dacă x este definit, ci dacă este adevărat. Șirurile de caractere, booleanul true și numerele pozitive sunt toate veridice (și s-ar putea să uit unele lucruri), dar alte valori potențial valide, cum ar fi 0, booleanul false și un șir de caractere gol, nu sunt veridice. Primul exemplu poate funcționa în anumite cazuri de utilizare (de exemplu, testarea unui șir de caractere dacă puteți trata gol la fel ca nedefinit), dar, din cauza numeroaselor cazuri în care nu va funcționa, nu ar trebui să fie considerat ca fiind modul implicit de verificare. –  > Por cfc.
Joe

Am făcut de multe ori:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}

Comentarii

  • Luați în considerare schimbarea „==” în „===”. Dacă apelați doSomething(null) veți primi și alerta. Doar dacă nu cumva asta este ceea ce doriți. –  > Por Jason S.
  • Da. Trebuie să decideți dacă doriți echivalent sau exact egal. Oricare dintre cele două cazuri ar putea avea o utilizare. –  > Por Joe.
  • pur și simplu verificați astfel-> if(typeof variableName !== ‘undefined’){ alert(variableName);} – –  > Por Muhammad Sadiq.
  • acest lucru este inutil, deoarece oricum nu veți putea trece o variabilă nedefinită într-o funcție –  > Por avalanche1.
  • Sigur că poți. Încercați să apelați o funcție fără niciun argument. –  > Por Joe.
svarog

The void returnează undefined pentru orice argument/expresie care îi este transmis, astfel încât să puteți testa rezultatul (de fapt, unele minificatoare schimbă codul din undefined la void 0 pentru a economisi câteva caractere)

De exemplu:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}

Comentarii

  • Ding ding! Acesta este răspunsul corect. Păcat că se află în partea de jos. Toată lumea este atât de obsedată de faptul că încă mai folosește typeof și să creadă undefined poate fi realocat, ceea ce nu a mai fost posibil de aproximativ un deceniu. –  > Por Stephen M Irving.
  • Acest lucru a fost, de asemenea, sigur înainte de ES5, deoarece atunci chiar dacă ați fi realocat undefined ,din cine știe ce motiv, folosind void 0 va returna întotdeauna undefined în orice caz. –  > Por Stephen M Irving.
ubershmekel

O altă „soluție” potențială este utilizarea window obiect. Aceasta evită problema erorii de referință atunci când se află într-un browser.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}

Comentarii

  • Acest lucru nu rezolvă deloc întrebarea inițială și este total irelevant. Posterul nu a întrebat cum să testeze dacă ceva este veridic sau fals, el a întrebat cum să testeze pentru undefined. Acest lucru nu va face acest lucru. –  > Por Stephen M Irving.
  • Deși sunt de acord cu Stephen, că acest lucru nu răspunde efectiv la întrebare, era exact ceea ce căutam. Mulțumesc @ubershmekel, ideea de a adăuga obiectul „window” m-a ajutat. +1 –  > Por Jarda.
JBallin

Eroarea vă spune că x nici măcar nu există! Nu a fost declarat, , ceea ce este diferit de a fi atribuit o valoare.

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

Dacă ați declarat x, , nu ați fi primit o eroare. Ați primi o alertă care spune undefined deoarece x există/a fost declarat, dar nu i s-a atribuit o valoare.

Pentru a verifica dacă variabila a fost declarată, puteți utiliza typeof, , orice altă metodă de a verifica dacă o variabilă există va ridica aceeași eroare pe care ați primit-o inițial.

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

Aceasta verifică tipul valorii stocate în x. Aceasta va returna doar undefined atunci când x nu a fost declarată SAU dacă a fost declarată a fost declarat și nu a fost încă atribuit.

Comentarii

  • Undefined a devenit readonly din ES5 (versiunea 2009) și nu mai aveți nevoie de typeof operator. –  > Por Stephen M Irving.
John

De asemenea, puteți utiliza operatorul condițional ternar:

Comentarii

  • Ce se întâmplă dacă var a = false;? Ar trebui să verificați că if a===undefined în schimb –  > Por Iter Ator.
  • Întrebare: verificați o variabilă nedefinită….. Aceasta este o variabilă nedefinită: var x; făcând mai sus va arunca o eroare –  > Por Muhammad Umer.
  • „Dacă a = false, atunci se va afișa „i dont know ‘a'”” – Aceasta este problema, întrebarea este de a testa dacă este definită, nu dacă este adevărată. Dacă a este definit ca fiind fals, atunci a nu este nedefinit. Acest lucru returnează un rezultat greșit în acest caz. Consultați comentariul meu de pe stackoverflow.com/a/858270/2055492 pentru mai multe detalii despre motivul pentru care această abordare nu funcționează. –  > Por cfc.
  • nu numai că !a va testa adevărat pentru undefined, dar testează adevărat și pentru 0 și null și false. Acest lucru este foarte incorect și ar trebui să fie eliminat. –  > Por Stephen M Irving.
mokiSRB

Eu folosesc adesea cea mai simplă cale:

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

EDIT:

Fără a inițializa variabila, se va lansa excepția „Uncaught ReferenceError: variabila nu este definită…”

Comentarii

  • Uncaught ReferenceError: variable is not defined –  > Por Muhammad Umer.
  • @MuhammadUmer, greșit! variable este definită de var variable;. Și acest fragment va suprascrie variable în domeniul local. Aceasta poate întrerupe logica care se așteaptă să acceseze o închidere sau o variabilă globală. Adică: var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined –  > Por Евгений Савичев.
Alireza

Doar faceți ceva de genul celor de mai jos:

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

și numiți-l ca:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false

Arshid KV

Putem verifica undefined după cum urmează

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}

Евгений Савичев

Răspunsul acceptat este corect. Am vrut doar să adaug încă o opțiune. De asemenea, puteți utiliza try ... catch bloc pentru a gestiona această situație. Un exemplu ciudat:

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
}

Fiți atenți la catch block, care este un pic dezordonat, deoarece creează un domeniu de aplicare la nivel de bloc. Și, bineînțeles, exemplul este extrem de simplificat pentru a răspunde la întrebarea pusă, nu acoperă cele mai bune practici în gestionarea erorilor ;).

MistyDawn

Eu folosesc o funcție mică pentru a verifica dacă o variabilă a fost declarată, ceea ce reduce cu adevărat cantitatea de dezordine din fișierele mele javascript. Adaug o verificare a valorii pentru a mă asigura că variabila nu numai că există, dar că i s-a atribuit și o valoare. Cea de-a doua condiție verifică dacă variabila a fost și instanțiată, deoarece dacă variabila a fost definită, dar nu și instanțiată (a se vedea exemplul de mai jos), aceasta va da o eroare dacă încercați să faceți referire la valoarea ei în codul dumneavoastră.

Nu este instanțiată – var my_variable; Instanțiată – var my_variable = "";

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

Puteți utiliza apoi o instrucțiune condițională pentru a testa dacă variabila a fost definită ȘI instanțiată, astfel…

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

sau pentru a testa dacă nu a fost definită și instanțiată, utilizați…

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }

Comentarii

  • De ce să nu vă întoarceți imediat predicatul? return typeof el !== "undefined" && typeof el.val() !== "undefined" –  > Por skubski.