JavaScript provjerava postoji li varijabla (definirana / inicijalizirana)

Koja je metoda provjere inicijalizacije varijable bolja / ispravnija? (Pretpostavljajući da varijabla može sadržavati bilo što (string, int, objekt, funkcija, itd.))

 if (elem) { // or !elem 

ili

 if (typeof(elem) !== 'undefined') { 

ili

 if (elem != null) { 
1312
25 февр. postavio Samuel Liew 25. veljače 2011-02-25 06:44 '11 u 6:44 2011-02-25 06:44
@ 29 odgovora

Operator typeof provjerava je li varijabla nedefinirana.

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

Operator typeof , za razliku od drugih operatora, ne baca ReferenceError iznimku kada se koristi s neprijavljenom varijablom.

Međutim, imajte na umu da typeof null vraća "object" . Moramo biti oprezni kako bismo izbjegli pogrešku inicijalizacije varijable prije null . Da bismo bili sigurni, to bismo mogli koristiti umjesto toga:

 if (typeof variable === 'undefined' || variable === null) { // variable is undefined or null } 

Za više informacija o korištenju strogih usporedbi === umjesto jednostavne jednakosti == vidi: Koji operator jednak (== vs ===) treba koristiti u uspoređivanju JavaScripta?

704
28 июня '11 в 19:00 2011-06-28 19:00 odgovor je dao Samuel Liew 28. lipnja 2009. u 19:00 sati 2011-06-28 19:00

Želite typeof operatora . Konkretno:

border=0
 if (typeof variable !== 'undefined') { // the variable is defined } 
2538
06 февр. Odgovor daje Jim Puls 6. veljače. 2009-02-06 07:56 '09 u 7:56 am 2009-02-06 07:56

U JavaScriptu se može definirati varijabla, ali zadržati undefined vrijednost, tako da najčešći odgovor nije tehnički ispravan i umjesto toga izvršava sljedeće:

 if (typeof v === "undefined") { // no variable "v" is defined in the current scope // *or* some variable v exists and has been assigned the value undefined } else { // some variable (global or local) "v" is defined in the current scope // *and* it contains a value other than undefined } 

Ovo može biti dovoljno za vaše potrebe. Sljedeći test ima jednostavniju semantiku, što olakšava precizno opisivanje ponašanja koda i sebe da biste ga razumjeli (ako ste zabrinuti):

 if ("v" in window) { // global variable v is defined } else { // global variable v is not defined } 

To, naravno, podrazumijeva da radite u pregledniku (gdje je window naziv globalnog objekta). Ali ako se trzate s takvim globalima, vjerojatno ste u pregledniku. Subjektivno, uporaba 'name' in window stilski je konzistentna s korištenjem window.name za upućivanje na globalne varijable. Pristup globalnim varijablama kao svojstvima window , a ne kao varijabli, minimizira broj neprijavljenih varijabli na koje upućujete u vašem kodu (u interesu popisa), i izbjegava mogućnost da će vaš globalni objekt biti zaklonjen lokalnom varijablom. Osim toga, ako globali uzrokuju da vaša koža skenira, možete se osjećati ugodnije dodirivati ​​ih samo s tim relativno dugim štapom.

182
22 окт. Odgovor je dao Brian Kelley 22. listopada. 2012-10-22 18:47 '12 u 18:47 2012-10-22 18:47

U većini slučajeva upotrebljavat ćete:

 elem != null 

Za razliku od jednostavnog if (elem) , dopušta 0 , false , NaN i '' , ali odbacuje null ili undefined , što ga čini dobrim općim testom za prisutnost argumenta ili svojstva objekta.


I druge provjere nisu netočne, samo imaju različite aplikacije:

  • if (elem) : može se koristiti ako je elem zajamčeno objekt, ili ako je false , 0 , itd. smatraju se zadanim vrijednostima (dakle, jednake undefined ili null ).

  • typeof elem == 'undefined' može se koristiti u slučajevima kada specificirani null ima jasnu vrijednost za neinicijaliziranu varijablu ili svojstvo.

    • Ovo je jedina provjera koja neće uzrokovati pogrešku ako elem nije deklariran. (tj., instrukcija var , ne svojstvo window > ili argument funkcije). To je, po mom mišljenju, prilično opasno, jer dopušta pogrešaka u pisanju da se nezamijećeno skliznu. Da biste to izbjegli, pogledajte donju metodu.

Stroga usporedba s undefined također korisna:

 if (elem === undefined) ... 

Međutim, budući da se globalna undefined može nadjačati drugom vrijednošću, najbolje je deklarirati varijablu undefined u trenutnom opsegu prije korištenja:

 var undefined; // really undefined if (elem === undefined) ... 

ili:

 (function (undefined) { if (elem === undefined) ... })(); 

Druga prednost ove metode je da JS minifieri mogu reducirati undefined varijablu na jedan znak, svaki put štedeći nekoliko bajtova.

112
25 февр. Odgovor daje David Tang 25. veljače. 2011-02-25 06:48 '11 u 6:48 2011-02-25 06:48

U mnogim slučajevima koristite:

 if (elem) { // or !elem 

obaviti posao za vas! ... provjerava sljedeće slučajeve:

  1. undefined : ako je vrijednost nedefinirana i undefined
  2. null : ako je nula, na primjer, ako DOM element ne postoji ...
  3. prazan redak : ''
  4. 0 : broj nula
  5. NaN : ne broj
  6. lažan

Tako će pokriti sve slučajeve, ali uvijek postoje čudni slučajevi koje bismo željeli dotaknuti, na primjer, niz s razmacima, kao što je ' ' jedan", on će biti definiran u javascriptu, jer ima mjesta unutar niza ... na primjer, u ovom slučaju dodajte još jednu provjeru s trim (), na primjer:

 if(elem) { if(typeof elem === 'string'  elem.trim()) { /// 

Osim toga, ove provjere su samo za vrijednosti , budući da objekti i nizovi rade različito u Javascriptu, prazna polja [] i prazni objekti {} uvijek su točni .

U nastavku kreiram sliku za brzo prikazivanje odgovora:

2019

01 сент. Odgovor je dat Alireza 01 Sep. 2017-09-01 09:15 '17 u 9:15 am 2017-09-01 09:15

Kako provjeriti postoji li varijabla

Ovo je prilično neprobojno rješenje za testiranje ako postoji i inicijalizirana varijabla:

 var setOrNot = typeof variable !== typeof undefined; 

Najčešće se koristi u kombinaciji s ternarnim operatorom za postavljanje zadane vrijednosti u slučaju da neka varijabla nije inicijalizirana:

 var dark = typeof darkColor !== typeof undefined ? darkColor : "black"; 

Problemi s enkapsulacijom

Nažalost, svoju provjeru ne možete jednostavno zatvoriti u funkciju.

Možda mislite o tome da učinite nešto slično:

 function isset(variable) { return typeof variable !== typeof undefined; } 

Međutim, to će proizvesti referentnu pogrešku ako nazovete, na primjer. isset(foo) i varijabla foo nisu definirane jer ne možete proslijediti nepostojeću varijablu u funkciju:

Nije pripremljeno ReferenceError: foo nije definirano


Testiranje nedefiniranih parametara funkcije

Iako se naša isset funkcija ne može koristiti za provjeru prisutnosti ili odsutnosti varijable (iz gore navedenih razloga), omogućuje nam da provjerimo jesu li parametri funkcije nedefinirani:

 var a = '5'; var test = function(x, y) { console.log(isset(x)); console.log(isset(y)); }; test(a); // OUTPUT : // ------------ // TRUE // FALSE 

Čak i ako vrijednost y nije prošla kroz test funkciju, naša isset funkcija radi dobro u tom kontekstu, budući da je y u test funkciji poznata kao undefined vrijednost.

59
19 февр. Odgovor koji je dao John Slegers 19. veljače 2016-02-19 14:54 16 u 14:54 2016-02-19 14:54

Provjerite je li objekt hasOwnProperty()

Alternativa hasOwnProperty() typeof odgovora je korištenje hasOwnProperty() , koji, naravno, provjerava ima li objekt (gotovo sve u JS) svojstvo, odnosno varijablu (usput).

Metoda hasOwnProperty() vraća logičku vrijednost koja pokazuje da li objekt ima specificirano svojstvo kao vlastito (ne nasljedivo) svojstvo.

Svaki objekt koji opada od objekta nasljeđuje hasOwnProperty() metodu. Ova metoda može se koristiti za određivanje ima li objekt određeno svojstvo kao izravno svojstvo ovog objekta; za razliku od operatora in, ova metoda ne provjerava lanac prototipova objekata.

43
02 мая '15 в 17:07 2015-05-02 17:07 Odgovor koji je dao Fred Gandt dana 02. svibnja u 17:07 2015-05-02 17:07

Postoji još jedan kratak način da to potvrdite kada izvodite jednostavne zadatke i povezane provjere. Samo upotrijebite uvjetni (trostruki) operator.

 var values = typeof variable !== 'undefined' ? variable : ''; 

Također će biti korisno kada pokušate deklarirati globalnu varijablu s dodjelom instance referentnoj varijabli.

Ako želite provjeriti varijablu, ona ne bi trebala biti undefined ili null . Zatim pokrenite naplatu u nastavku.

Kada je varijabla deklarirana, a želite provjeriti vrijednost, ona je čak i jednostavna: i zajedno će izvoditi undefined i null provjere.

 var values = variable ? variable : ''; 
39
19 февр. Odgovor daje RajeshKdev 19. veljače. 2016-02-19 08:26 '16 u 8:26 am 2016-02-19 08:26

undefined, boolean, string, broj, funkcija

 if (typeof foo! == 'undefined') {  } 

Objekt, polje

 if( foo instanceof Array ) { } 
27
26 июля '13 в 5:08 2013-07-26 05:08 odgovor je dao Yuan Zhaohao 26. srpnja '13. u 5:08 am 2013-07-26 05:08

Ovisi o tome trebate li definirati varijablu ili ako želite imati vrijednost.

Provjera je li tip nedefiniran provjerava je li varijabla još uvijek definirana.

=== null ili !== null će provjeriti je li vrijednost varijable uistinu null .

== null ili != null će provjeriti je li vrijednost undefined ili null .

if(value) provjerava je li varijabla undefined , null , 0 ili prazan niz.

25
25 февр. Odgovor daje Alan Geleynse 25. veljače. 2011-02-25 06:46 '11 u 6:46 2011-02-25 06:46

Najtočniji odgovor je točan, koristite typeof.

Međutim, želio bih istaknuti da je u undefined JavaScriptu promjenjivo (zbog nekog nepogrešivog razloga). Stoga, jednostavno provjeravanje varName !== undefined možda se neće uvijek vratiti kao što očekujete, jer se druge knjižnice mogu promijeniti nedefinirane. Čini se da nekoliko odgovora (@ skalee's, za jednu) ne želi koristiti typeof , a to može uzrokovati probleme.

"Stari" način rješavanja ovoga bio je deklarirati nedefinirano kao var kako bi se nadoknadilo moguće isključivanje / prebacivanje undefined . Međutim, najbolji način da i dalje koristite typeof je taj što će zanemariti bilo kakvo poništavanje undefined iz drugog koda. Pogotovo ako pišete kod za upotrebu u divljini, gdje netko zna što još može raditi na stranici ...

11
22 февр. odgovor je dao shadowstorm 22. veljače 2013-02-22 21:23 '13 u 21:23 2013-02-22 21:23
 if (typeof console != "undefined") { ... } 

Ili bolje

 if ((typeof console == "object")  (typeof console.profile == "function")) { console.profile(f.constructor); } 

Radi u svim preglednicima

10
03 янв. odgovor je dat boslior 03 jan. 2013-01-03 11:08 '13 u 11:08 2013-01-03 11:08

Da bih pridonio raspravi, ako znam da varijabla mora biti string ili objekt, uvijek preferiram if (!variable) , pa provjeravam je li lažna. To može dovesti do čišćeg koda, na primjer:

8
28 янв. odgovor je dan de3 28 jan. 2016-01-28 14:11 '16 u 14:11 2016-01-28 14:11

Teško je razlikovati nedefinirano i nulto. Null je vrijednost koju možete dodijeliti varijabli ako želite naznačiti da varijabla nema određenu vrijednost. Nedefinirano je posebna vrijednost koja će biti zadana vrijednost za nedodijeljene varijable.

 var _undefined; var _null = null; alert(_undefined); alert(_null); alert(_undefined == _null); alert(_undefined === _null);var _undefined; var _null = null; alert(_undefined); alert(_null); alert(_undefined == _null); alert(_undefined === _null); 
7
25 февр. odgovor je dao Jith 25. veljače 2011-02-25 07:08 '11 u 7:08 2011-02-25 07:08

Ti odgovori (osim odluke Freda Gandta) su ili netočni ili nepotpuni.

Pretpostavimo da trebam variableName; prođe vrijednost undefined , te je stoga deklarirana na način var variableName; što znači da je već pokrenut ; - Kako provjeriti je li to najavljeno ranije?

Ili još bolje - kako mogu odmah provjeriti postoji li "Book1.chapter22.agraph37" s jednim pozivom, ali ne uzrokuje referentnu pogrešku?

To radimo s najmoćnijim operatorom JasvaScripta u .:

 "[variable||property]" in [context||root] >> true||false 

U vrijeme popularnosti AJAX-a, napisao sam metodu (kasnije nazvanu) isNS (), koja je u stanju odrediti postoji li prostor imena, uključujući duboke testove za nazive svojstava, kao što je "Book1.chapter22.agraph37" i još mnogo toga.

No, budući da je prethodno objavljena i zbog svoje velike važnosti zaslužuje da bude objavljena u zasebnoj temi, neću je ovdje objaviti, nego dajem ključne riječi ( javascript + isNS ), što će vam pomoći da pronađete izvorni kod kojeg podržavaju sva potrebna objašnjenja.

7
27 дек. Odgovor daje Bekim Bacaj 27. prosinca. 2016-12-27 05:55 '17 u 5:55 2016-12-27 05:55

Null je vrijednost u javascriptu i typeof null vraća "object"

Prema tome, primljeni odgovor neće raditi ako proslijedite null vrijednosti. Ako prosljeđujete null vrijednosti, morate dodati dodatnu provjeru za null vrijednosti:

 if ((typeof variable !== "undefined")  (variable !== null)) { // the variable is defined and not null } 
7
21 сент. Odgovor je dao Razan Paul 21 sep . 2015-09-21 08:20 '15 u 8:20 sati 2015-09-21 08:20

Najpouzdaniji "je definiran" provjerava se pomoću typeof

 if (typeof elem === 'undefined') 

Ako jednostavno provjeravate određenu varijablu da biste dodijelili zadanu vrijednost, često to možete učiniti za čitljivi pojedinačni liner:

 elem = elem || defaultElem; 

Često je korisno koristiti: idiomatski način postavljanja zadanih vrijednosti u javascript.

Tu je i jedan liner koji koristi ključnu riječ typeof :

 elem = (typeof elem === 'undefined') ? defaultElem : elem; 
6
30 сент. odgovor je dat Zv_oDD 30 sep . 2014-09-30 15:35 '14 u 15:35 2014-09-30 15:35

Možete koristiti typeof operatora.

Na primjer

 var dataSet; alert("Variable dataSet is : " + typeof dataSet); 

Gornji isječak koda vraća izlaz, na primjer

varijabilni dataSet: undefined.

6
25 апр. Odgovor dao Ravindra Miyani 25. travnja. 2014-04-25 08:20 '14 u 8:20 2014-04-25 08:20

Moja je prednost typeof(elem) != 'undefined' elem != null .

Međutim, ako odaberete, razmotrite stavljanje provjere u takvu funkciju

 function existy (x) { return typeof (x) != 'undefined'  x != null; } 

Ako ne znate da je varijabla deklarirana, nastavite s typeof (x) != 'undefined' x != null;

Ako znate da je varijabla deklarirana, ali možda ne postoji, možete je koristiti

 existy(elem)  doSomething(elem); 

Varijabla koju provjeravate ponekad može biti pridruženo svojstvo. Možete koristiti propovijed || {} da se spusti niz crtu i provjeri postojanje relevantne imovine:

 var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4; 

Nakon svake upotrebe svojstva (... '|| {}'). nextProp tako da svojstvo koje nedostaje ne daje pogrešku.

Ili možete upotrijebiti existy(o) existy(op) existy(opq) doSomething(opq)

5
13 дек. odgovor dati curtwphillips Prosinac 13 2015-12-13 10:39 '15 u 10:39 2015-12-13 10:39

Ako želite da određeni blok nešto učini, upotrijebite ga

 if (typeof variable !== 'undefined') { // the variable is defined } 

Ako želite da nedefinirani blok izvrši nešto ili dodijeli ili definira varijablu, upotrijebite ovo

 if (typeof variable === 'undefined') { // the variable is undefined } 
5
11 окт. odgovor je dao Vinayak Shedgeri 11. listopada. 2017-10-11 15:06 '17 u 15:06 2017-10-11 15:06

U specifičnoj situaciji iznesenoj u pitanju,

 typeof window.console === "undefined" 

odgovara

 window.console === undefined 

Ja više volim ovo drugo, jer je kraće.

Primijetite da console gledamo samo u globalnom opsegu (koji je objekt window u svim preglednicima). U ovoj određenoj situaciji to je poželjno. Ne želimo da console definirana negdje drugdje.

@ BrianKelley u svom velikom odgovoru objašnjava tehničke detalje. Upravo sam dodao nedostatak izlaza i digestirao ga za nešto lakše za čitanje.

5
17 февр. Odgovor je dat skalee 17. veljače. 2013-02-17 06:31 '13 u 6:31 am 2013-02-17 06:31

Koristim dvije različite metode ovisno o objektu.

 if( !variable ){ // variable is either // 1. ''; // 2. 0; // 3. undefined; // 4. null; // 5. false; } 

Ponekad ne želim procijeniti prazan niz kao lažni, pa koristim ovaj slučaj

 function invalid( item ){ return (item === undefined || item === null); } if( invalid( variable )){ // only here if null or undefined; } 

Ako vam treba suprotno, onda u prvoj kopiji! Varijabla postaje varijabla !!, a u neispravnoj funkciji === postaje! = Imena funkcija mijenjaju se u notInvalid.

4
03 июля '15 в 22:45 2015-07-03 22:45 odgovor je dao SoEzPz 03. srpnja u 15.45 sati u 22.45 sati

Malo funkcionalniji i jednostavniji za upotrebu:

 function exist(obj) { return (typeof obj !== 'undefined'); } 

Funkcija vraća istinu ako postoji, inače lažna ako ne postoji.

3
11 сент. Odgovor je dat na 11 sep . 2015-09-11 12:51 '15 u 12:51 2015-09-11 12:51

To ovisi o situaciji. Ako testirate nešto što može ili ne mora biti globalno definirano izvan vašeg koda (na primjer, jQuery), želite:

 if (typeof(jQuery) != "undefined") 

(Tamo nema potrebe za strogom jednakošću, typeof uvijek vraća string.) Ali ako imate argumente za funkciju koja može ili ne može biti proslijeđena, oni će uvijek biti definirani, ali null ako su izostavljeni.

 function sayHello(name) { if (name) return "Hello, " + name; else return "Hello unknown person"; } sayHello(); // => "Hello unknown person" 
3
25 февр. odgovor od jpsimons 25. velj 2011-02-25 07:15 '11 u 7:15 am 2011-02-25 07:15

Kako o jednostavnom:

 if(!!variable){ //the variable is defined } 
2
26 июня '15 в 16:13 2015-06-26 16:13 Odgovor je dao JasoonS 26. lipnja u 16:13 sati 2015-06-26 16:13

Zapamtite to kada provjeravate! == ili! = Protiv "nedefiniranih", neće raditi

Testirano na Firfoxfox Quantum 60.0.1

koristite takav test kako biste izbjegli sukobe

 if(!(typeof varibl['fl'] === 'undefined')) { console.log(varibl['fl']); console.log("Variable is Defined"); }else{ console.log(varibl['fl']); console.log("Variable is Un-Defined"); } 
0
31 мая '18 в 10:32 2018-05-31 10:32 odgovor je dao Aylian Craspa 31. svibnja '18 u 10:32 2018-05-31 10:32

Da bih provjerio je li varijabla deklarirana / postavljena, napravio sam ovaj prljavi trik.

Nisam pronašao način za izdvajanje koda u funkciji, čak i sa eval .

 "use strict"; // var someVar; var declared; try { someVar; declared = true; } catch(e) { declared = false; } if (declared) { console.log("someVar is declared; now has the value: " + someVar); } else { console.log("someVar is not declared"); } 
-1
05 апр. odgovor je dat Ferran Maylinch 05 travanj. 2016-04-05 20:04 '16 u 20:04 2016-04-05 20:04

Nisam siguran da bi ovo pomoglo, morao sam provjeriti je li Var, koji je definiran na stranici, odabran prije pokretanja pripadajućih skripti, i za mene je to dobro funkcioniralo.

 if (window.myvar) { // run scripts here } 

To je malo jednostavno, ali dobro za jednu ili slično.

-3
16 нояб. Odgovor je dao Jordan Smith 16. studenog. 2017-11-16 19:23 '17 u 19:23 2017-11-16 19:23

Ne vidim to u gore navedenim odgovorima, pa ga nudim ovdje, mislim.

 function isDefined(x) { return !!x } if( isDefined(x) ) { //The variable is defined } 

! x će vratiti istinu ako je x ili null ili undefined , pa !! x vraća true ako x nije ni nedefiniran niti null.

Shvaćam da to također objašnjava slučaj nula, ali ovdje je pravedno upozorenje o tome.

-4
26 авг. Odgovor je dan TauOmicronMu 26 aug. 2016-08-26 18:44 '16 u 18:44 2016-08-26 18:44