Obyekt obyektinin təsviri qeyri-müəyyəndir

JavaScript-də bir obyektin mülkiyyəti müəyyənləşdirilmədiyini yoxlamaq üçün ən yaxşı yol nədir?

2533
26 авг. Matt Sheppard tərəfindən qoyulan 26 aug. 2008-08-26 10:25 '08 at 10:25 2008-08-26 10:25
@ 43 cavab
  • 1
  • 2

İstifadə edin:

 if (typeof something === "undefined") { alert("something is undefined"); } 

Bir obyektin dəyişən xüsusiyyətləri varsa, eyni şəkildə istifadə edə bilərsiniz:

 if (typeof my_obj.someproperties === "undefined"){ console.log('the property is not available...'); // print into console } 
2431
06 янв. Cavab verildi Erwin 06 yanvar. 2009-01-06 15:27 '09 saat 15:27 'da 2009-01-06 15:27

Hesab edirəm ki, bu mövzuda bir sıra səhv cavablar var. Möhtərəm inancın əksinə olaraq, "undefined" JavaScript- də bir açar söz deyil və əslində ona təyin edilmiş bir dəyəri ola bilər.

Doğru kod

Bu testi yerinə yetirmək üçün ən etibarlı yol:

 if (typeof myVar === "undefined") 
border=0

Bu daima doğru nəticəni verir və hətta myVar elan myVar bir vəziyyətlə myVar .

Degenerate kodu. KULLANMAYIN.

 var undefined = false; // Shockingly, this is completely legal! if (myVar === undefined) { alert("You have been misled. Run away!"); } 

Bundan əlavə, myVar === undefined bir vəziyyətdə bir səhv səbəb olacaq.

837
23 авг. Cavab MarkPflug 23 av . 2010-08-23 21:03 '10 da 21:03 'da 2010-08-23 21:03

Burada çox sayda digər cavabı tövsiyə typeof , typeof - pis seçimdir. Değişkenlerin belirlenemeyen undefined olub olmadığını kontrol etmek üçün heç bir zaman istifadə edilməməlidir, çünki undefined bir dəyərin birləşdirilmiş sınağı kimi çıxış edir və dəyişən olub olmadığını undefined etmək. Əksər hallarda, dəyişən bir dəyişiklik olduğunda bilirsiniz və typeof dəyişən adda və ya simvolu literal 'undefined' yazı tipi typeof sadəcə səssiz bir qəzanın potensialını təmsil edir.

 var snapshot = …; if (typeof snaposhot === 'undefined') { // ^ // misspelled¹ – this will never run, but it won't throw an error! } 
 var foo = …; if (typeof foo === 'undefned') { // ^ // misspelled – this will never run, but it won't throw an error! } 

Beləliklə, müəyyən bir funksiyanın əhatə dairəsi (məsələn, typeof module !== 'undefined' testi typeof module !== 'undefined' Common_JS" xüsusi kodunda bir addım kimi typeof module !== 'undefined' olub-olmaması ilə bağlı qeyri-müəyyənlik olduğu aşkar olunmazsa, typeof zərərli seçimdir bir dəyişən istifadə edərək, düzgün seçim dəyərin birbaşa müqayisəsidir:

 var foo = …; if (foo === undefined) { ⋮ } 

Bununla bağlı bəzi ümumi yanlış fikirlər daxildir:

  • "barındırılmamış" dəyişən ( var foo ) və ya bir parametr ( bar() ) adlanan bir function bar(foo) { … } səhvdir. Bu, sadəcə, doğru deyildir: müəyyən başlanğıc olmadan dəyişənlər və bir dəyər göstərməmiş parametrlər həmişə undefined və həmişə əhatə dairəsindədir.

  • undefined yazıla bilər. Bunun üçün bir çox şey var. undefined javascript bir söz deyil. Bunun əvəzində, qlobal bir obyektin təsviri Undefined bir dəyəri ilə. Bununla belə, ES5-dən bu əmlak yalnız oxundu və yapılandırılabilir deyil. Heç bir müasir brauzer mülkü dəyişməyinizə imkan verməyəcək və 2017-ci ildən bəri bu uzun müddətdir keçirilir. Sıx rejimin olmaması undefined edilməyən s davranışına təsir göstərmir - sadəcə təsəvvür edilməyən undefined = 5 kimi bir şey etməmək, atmaq deyil. Bu bir açar söz deyil olduğundan, undefined dəyişənləri bəyan edə bilərsiniz və bu dəyişənlər dəyişdirilə bilər ki, bu bir dəfə şablon təşkil edir:

     (function (undefined) { // … })() 

    Qlobal istifadə undefined daha təhlükəli. ES3 ilə uyğun olmalısan, void 0 ilə undefined - typeof əlaqə typeof . (Bir void həmişə hər hansı bir operand üçün müəyyən edilməyən dəyərləri qiymətləndirən təkər operatoru olmuşdur.)

Yol dəyişənləri kənara çıxarsa, faktiki sualları həll etmək vaxtıdır: obyektin xüsusiyyətləri. typeof xüsusiyyətləri üçün typeof istifadə etmək heç bir mənası yoxdur. Bir funksiyanın aşkar edilməsi ilə bağlı əvvəlki istisna burada tətbiq edilmir - typeof yalnız dəyişənlərin xüsusi davranışı var və bir obyektin xüsusiyyətlərinə istinad edən ifadələr dəyişən deyildir.

Bu,

 if (typeof foo.bar === 'undefined') { ⋮ } 

həmişə tam bərabərdir:

 if (foo.bar === undefined) { ⋮ } 

və yuxarıda göstərilən məsləhətləri nəzərə alaraq, niyə istifadə typeof barədə oxucuları çaşdırmaq deyil, çünki bərabərliyi yoxlamaq üçün === istifadə etmək typeof , çünki dəyişənlərin dəyərini daha sonra yoxlamaq üçün yenidən təşkil edilə bilər və bu yalnız görünür daha yaxşı, həmişə === undefined ³ burada istifadə etməlisiniz .

Obyektlərin xüsusiyyətlərinə gəldikdə nəzərə alınacaq başqa bir şey, həqiqətən, tamamilə undefined olub olmadığını yoxlamaq istəməyinizdir. Bu əmlakın adı obyektin özü üzərində təsvir edilməyən obyektin ( undefined dəyərini oxuyarkən) undefined dəyər ilə undefined edilə bilmədiyi və ya dəyəri undefined hər hansı bir obyektin prototipində mövcud olan obyektdə olmamalıdır. Object.prototype.hasOwnProperty.call(obj, 'key') obyektlərin prototip zəncirində olub olmadığını və Object.prototype.hasOwnProperty.call(obj, 'key') obyektin birbaşa olub olmadığını sizə xəbər verəcəkdir. Mən bu prototip cavabında ətraflı məlumat verməyəcəyəm və başlıca sualın olası şərhlərindən asılı olmayaraq, başqaları cavabdeh olan bütün pis məsləhətlərlə məşğul olmaq məqsədi daşıdığından, obyektlərin əsas şəkillərlə şəklində istifadə etməyəcəyəm. Daha çox məlumat üçün MDN üzərində prototip obyektlərini oxuyun!

Məsələn ¹ qeyri-adi dəyişən ad seçimi? Firefox üçün NoScript uzantısından gerçek ölü kodu.
Səmimiyyətin nə olduğunu bilmədən, hər şeyin məqsədi olduğunu düşünməyin. Dinamik sahənin sui-istifadəsi nəticəsində yaranan bonus zəiflik: Project Zero 1225
³ ES5 + ətraf mühitini təkrar qəbul edir və undefined undefined , qlobal obyektin undefined xüsusiyyətinə aiddir. başqa şəkildə void 0 dəyişdirin.

161
27 февр. Cavab verilir Ry - 27 fevral. 2014-02-27 00:17 '14 'də 0:17 2014-02-27 00:17

JavaScript nulladırmüəyyənləşdirilmir . Fərqli mənaları var.

  • qeyri-müəyyəndir ki, dəyişənin dəyəri müəyyən edilmir; bu mənanın nə olduğu məlum deyil.
  • null , dəyişənin dəyəri müəyyən edilmiş və null (dəyərsiz) olaraq təyin edilmişdir.

Mariein Haverbecke, pulsuz sadə JavaScript ebook (mənim diqqətim):

Bənzər bir dəyər də var, null, dəyəri "bu dəyər müəyyən edilir, lakin dəyəri yoxdur". Müəyyən olmayan və sıfır arasındakı mənfi fərq əsasən akademikdir və adətən bu çox maraqlı deyil. Praktiki proqramlarda, bir məsələni yoxlamaq üçün tez-tez çox vacibdir ". Bu hallarda == müəyyən bir ifadənin istifadə edilə bilər, çünki onlar tam olaraq eyni dəyər deyil, null == undefined həqiqətə dönəcəkdir.

Beləliklə, bir şeyin müəyyənləşdirilmədiyini yoxlamaq üçün ən yaxşı yol hesab edirəm:

 if (something == undefined) 

Bu kömək edir!

Düzenle: Düzenlemeye cavab olaraq, obyektin xüsusiyyətləri eyni işləməlidir.

 var person = { name: "John", age: 28, sex: "male" }; alert(person.name); // "John" alert(person.fakeVariable); // undefined 
142
26 авг. Cavab Pandincus 26 avqustda verilir . 2008-08-26 10:36 '08 at 10:36 2008-08-26 10:36

Bu nə deməkdir: "bir obyektin təsviri olmayan mülkiyyət ?

Əslində, bu tamamilə fərqli iki şey deməkdir! Birincisi, bir obyektdə heç vaxt müəyyən edilməmiş bir əmlak deməkdir və ikincisi, müəyyənləşdirilməmiş bir dəyəri olan bir əmlak deməkdir. Bu koda baxın:

 var o = { a: undefined } 

oa undefined? Bəli Onun dəyəri qeyri-müəyyəndir. Müəyyən deyil mi? Əlbəttə! Heç bir 'b' əmlakı yoxdur! Hər iki vəziyyətdə fərqli yanaşmaların necə davranıldığına baxın:

 typeof oa == 'undefined' // true typeof ob == 'undefined' // true oa === undefined // true ob === undefined // true 'a' in o // true 'b' in o // false 

typeof obj.prop == 'undefined'obj.prop === undefined edilmədiyi halda, bu növü fərqlənir və bu fərqli vəziyyətlər arasında fərq yoxdur. 'prop' in obj , əmlakın tamamilə müəyyənləşdirilmədiyi və əmlakın dəyərinə diqqət yetirməyən bir vəziyyətin təsbit edilə bilməyəcəyi üçün müəyyən edilə bilməz.

Nə edəcəyik?

1) müəyyənləşdirilməyən əmlakın birinci və ya ikinci dəyər (ən tipik vəziyyət) olub olmadığını bilmək istərsiniz.

 obj.prop === undefined // IMHO, see "final fight" below 

2) Yalnız bir obyektin bir mülkiyyətə malik olduğunu və onun dəyərinə əhəmiyyət vermədiyini bilmək istəyirsən.

 'prop' in obj 

Qeydlər:

  • Bir obyektin və onun əmlakının eyni vaxtda yoxlanmasına bilməzsiniz. Məsələn, bu xa === undefined və ya bu typeof xa == 'undefined' çağırır ReferenceError: x is not defined edilmədiyi halda müəyyən edilmir.
  • Dəyişən undefined window.undefined , qlobal bir dəyişkəndir (beləliklə, brauzerlərdə window.undefined ). ECMAScript 1st Edition ilə dəstəklənir və ECMAScript 5 ilə yalnız oxunur . Buna görə, müasir brauzerlərdə, həqiqətə yenidən baxıla bilməz, çünki bir çox müəllif bizi qorxutmaq istəyir, amma bu, köhnə brauzerlər üçün hələ də doğrudur.

Final döyüşü: obj.prop === undefined vs typeof obj.prop == 'undefined'

obj.prop === undefined :

  • Bir az qısa və bir az gözəl görünür.
  • Javascript mexanizmi undefined bir səhv varsa səhv mesajı verəcəkdir

Dezavantajları obj.prop === undefined :

  • köhnə brauzerlərdə undefined bilər.

typeof obj.prop == 'undefined' :

  • Bu həqiqətən universaldır! Yeni və köhnə brauzerlərdə işləyir.

typeof obj.prop == 'undefined' dezavantajları:

  • 'undefned' (səhv ilə) yalnız bir 'undefned' , buna görə də JavaScript 'undefned' bir səhv varsa, mən onu 'undefned' kimi sizə kömək edə bilməz.

Güncelle (server-javascript üçün):

Node.js qlobal dəyişənə global.undefined ( undefined 'global' prefiks olmadan da istifadə edilə bilər) kimi dəstəklənmir. Server tərəfindəki JavaScript-nin digər tətbiqləri haqqında bilmirəm.

109
08 авг. Konstantin Smolyanin tərəfindən verilmiş cavab 08 avqust. 2013-08-08 23:28 '13 at 23:28 2013-08-08 23:28

Problem üç hala düşür:

  • Cisim bir əmlaka malikdir və dəyəri undefined .
  • Nesne bir əmlaka malikdir və dəyəri undefined .
  • Obyenin heç bir mülkiyyəti yoxdur.

Bu bizə vacib bir şey deyir:

İstifadəçi ilə müəyyən edilməyən və müəyyən bir dəyərə sahib olmayan bir üzv arasında fərq var.

Amma təəssüf ki, typeof obj.foo , bizdə olan üç hadisədən bizə məlumat vermir. Buna baxmayaraq, biz bunu "foo" in obj ayırmaq üçün "foo" in obj ilə birləşdirə bilərik.

  | typeof obj.x === 'undefined' | !("x" in obj) 1. { x:1 } | false | false 2. { x : (function(){})() } | true | false 3. {} | true | true 

Qeyd etmək lazımdır ki, bu testlər null girişlər üçün də eynidır.

  | typeof obj.x === 'undefined' | !("x" in obj) { x:null } | false | false 

Mən deyərdim ki, bəzi hallarda bu əmlakın müəyyənləşdirilmədiyini yoxlamaq üçün yox, yoxlamaq və (bu çekin fərqli olacağı) tək vəziyyət 2-də, faktiki girişin nadir hallarda olduğunu yoxlamaq üçün mənalı və aydındır. Unsuslaşdırıla bilməyən bir obyekt.

Məsələn: Mən bir obyektin müəyyən bir mülkiyyətə malik olub olmadığını görmək üçün bir neçə qrup çekləri olan bir dəstə kodunu yenidən işlətdim.

 if( typeof blob.x != 'undefined' ) { fn(blob.x); } 

Belirlenmeden kontrol etmədən yazarkən aydın oldu.

 if( "x" in blob ) { fn(blob.x); } 

Lakin, artıq qeyd olunduğu kimi, bu, eyni deyil (amma ehtiyaclarım üçün kifayət qədərdir).

62
08 июня '11 в 7:04 2011-06-08 07:04 Cavab Michael Anderson tərəfindən 08 iyun 'da 7:04' də verildi. 2011-06-08 07:04
 if ( typeof( something ) == "undefined") 

Mənim üçün çalışdı, başqaları olmadı.

40
27 июля '10 в 19:03 2010-07-27 19:03 27 iyul 'da saat 19:03' da Kevinə cavab verdi 2010-07-27 19:03

Mən typeof === dan istifadə etdiyini typeof və mən gördüyüm bir konvensiya olaraq, bir çox kitabxanada istifadə olunur, amma typeof operatoru bir simli literal qaytarır və biz bunun qarşısında nə olduğunu bilirik, niyə də yazmaq istəyirik? və onu yoxlayın?

 typeof x; // some string literal "string", "object", "undefined" if (typeof x === "string") { // === is redundant because we already know typeof returns a string literal if (typeof x == "string") { // sufficient 
35
22 сент. Cavab 22 sentyabrda Eric tərəfindən verilir. 2010-09-22 17:20 '10 at 17:20 'da 2010-09-22 17:20

Müvafiq bir sual üzərinə cavabıma cavab verin. JavaScript-dəki "undefined" -ni necə yoxlamaq olar?

Bu məsələyə xüsusi olaraq baxın, someObject.<whatever> baxın.


Müxtəlif cavabların nəticələrini əks etdirən bəzi ssenarilər: http://jsfiddle.net/drzaus/UVjM4/

(Müəyyən bir miqyaslı bir qabığı istifadə edərkən testlərdə istifadə etmək vacibdir)

Referans kodu:

 (function(undefined) { var definedButNotInitialized; definedAndInitialized = 3; someObject = { firstProp: "1" , secondProp: false // , undefinedProp not defined } // var notDefined; var tests = [ 'definedButNotInitialized in window', 'definedAndInitialized in window', 'someObject.firstProp in window', 'someObject.secondProp in window', 'someObject.undefinedProp in window', 'notDefined in window', '"definedButNotInitialized" in window', '"definedAndInitialized" in window', '"someObject.firstProp" in window', '"someObject.secondProp" in window', '"someObject.undefinedProp" in window', '"notDefined" in window', 'typeof definedButNotInitialized == "undefined"', 'typeof definedButNotInitialized === typeof undefined', 'definedButNotInitialized === undefined', '! definedButNotInitialized', '!! definedButNotInitialized', 'typeof definedAndInitialized == "undefined"', 'typeof definedAndInitialized === typeof undefined', 'definedAndInitialized === undefined', '! definedAndInitialized', '!! definedAndInitialized', 'typeof someObject.firstProp == "undefined"', 'typeof someObject.firstProp === typeof undefined', 'someObject.firstProp === undefined', '! someObject.firstProp', '!! someObject.firstProp', 'typeof someObject.secondProp == "undefined"', 'typeof someObject.secondProp === typeof undefined', 'someObject.secondProp === undefined', '! someObject.secondProp', '!! someObject.secondProp', 'typeof someObject.undefinedProp == "undefined"', 'typeof someObject.undefinedProp === typeof undefined', 'someObject.undefinedProp === undefined', '! someObject.undefinedProp', '!! someObject.undefinedProp', 'typeof notDefined == "undefined"', 'typeof notDefined === typeof undefined', 'notDefined === undefined', '! notDefined', '!! notDefined' ]; var output = document.getElementById('results'); var result = ''; for(var t in tests) { if( !tests.hasOwnProperty(t) ) continue; // bleh try { result = eval(tests[t]); } catch(ex) { result = 'Exception--' + ex; } console.log(tests[t], result); output.innerHTML += "\n" + tests[t] + ": " + result; } })(); 

Və nəticələr:

 definedButNotInitialized in window: true definedAndInitialized in window: false someObject.firstProp in window: false someObject.secondProp in window: false someObject.undefinedProp in window: true notDefined in window: Exception--ReferenceError: notDefined is not defined "definedButNotInitialized" in window: false "definedAndInitialized" in window: true "someObject.firstProp" in window: false "someObject.secondProp" in window: false "someObject.undefinedProp" in window: false "notDefined" in window: false typeof definedButNotInitialized == "undefined": true typeof definedButNotInitialized === typeof undefined: true definedButNotInitialized === undefined: true ! definedButNotInitialized: true !! definedButNotInitialized: false typeof definedAndInitialized == "undefined": false typeof definedAndInitialized === typeof undefined: false definedAndInitialized === undefined: false ! definedAndInitialized: false !! definedAndInitialized: true typeof someObject.firstProp == "undefined": false typeof someObject.firstProp === typeof undefined: false someObject.firstProp === undefined: false ! someObject.firstProp: false !! someObject.firstProp: true typeof someObject.secondProp == "undefined": false typeof someObject.secondProp === typeof undefined: false someObject.secondProp === undefined: false ! someObject.secondProp: true !! someObject.secondProp: false typeof someObject.undefinedProp == "undefined": true typeof someObject.undefinedProp === typeof undefined: true someObject.undefinedProp === undefined: true ! someObject.undefinedProp: true !! someObject.undefinedProp: false typeof notDefined == "undefined": true typeof notDefined === typeof undefined: true notDefined === undefined: Exception--ReferenceError: notDefined is not defined ! notDefined: Exception--ReferenceError: notDefined is not defined !! notDefined: Exception--ReferenceError: notDefined is not defined 
21
13 янв. Cavab yanvarın 13-də verilir 2013-01-13 20:43 '13 at 20:43 pm 2013-01-13 20:43

Əgər etsəniz

 if (myvar == undefined ) { alert('var does not exists or is not initialized'); } 

myvar dəyişən myvar halda işləməyəcək, çünki myvar müəyyən edilməmişdir, buna görə skript sınıq və test heç bir təsiri yoxdur.

Pəncərə obyektinin funksiyadan kənarda qlobal miqyaslı (default obyekt) olduğu üçün, deklarasiya pencere obyektinə əlavə olunacaq.

Məsələn:

 var myvar = 'test'; 

Myvar global dəyişən window.myvar və ya pəncərə ilə eynidır ['myvar']

Qlobal bir dəyişkən olduğunda yoxlama üçün səhvlərin qarşısını almaq üçün istifadə etmək daha yaxşıdır:

 if(window.myvar == undefined ) { alert('var does not exists or is not initialized'); } 

Bir dəyişən həqiqətən mövcud olub-olmadığı məsələsi əhəmiyyətli deyil, dəyəri yanlışdır. Əks təqdirdə, dəyişənləri qeyri-müəyyənləşdirməklə başlamaq üçün ağılsızlıqdır və başlanğıc üçün yanlış istifadə etmək daha yaxşıdır. Bəyan etdiyiniz bütün dəyişənlərin yalanla başlatıldığını bildiyiniz zaman, sadəcə onun növünü yoxlaya bilərsiniz və ya düzgün və etibarlı dəyərə malik olduğunu yoxlamaq üçün !window.myvar a müraciət edə bilərsiniz. Beləliklə, dəyişən müəyyən edilmədikdə belə, myvar = undefined myvar = false və ya myvar = false və ya myvar = 0 .

Müəyyən bir növü gözlədiyiniz zaman, dəyişənlərin növünü yoxlayın. Dövlət testlərini sürətləndirmək üçün daha yaxşı olarsınız:

 if( !window.myvar || typeof window.myvar != 'string' ) { alert('var does not exists or is not type of string'); } 

İlk və sadə şərait doğru olduqda, tərcüməçi aşağıdakı testləri atlayır.

Cari dəyərə malik olub olmadığını yoxlamaq üçün bir nümunə / obyekt dəyişənindən istifadə etmək həmişə yaxşıdır. Daha sabitdir və proqramın ən yaxşı yoludur.

(y)

16
12 авг. Cavab Codebeat 12 aug tərəfindən verilir . 2011-08-12 17:40 '11 'də 17:40' da 2011-08-12 17:40

Görmədim (ümid edirəm ki, onu əldən vermirdim), kimsə əmlakın qarşısında obyekti yoxladı. Beləliklə, bu ən qısa və ən təsirli (baxmayaraq aydın deyil):

 if (obj  obj.prop) { // Do something; } 

Obj və ya obj.prop müəyyən edilmədikdə, null və ya "falsi", əgər if ifadəsi bir blok kodunu icra etməyəcəkdir. Bu, adətən, çoxlu kod blok operatorlarında (javascript) istənilən davranışdır.

15
25 сент. Joe Johnson tərəfindən 25 Sentyabrda verilən cavab . 2012-09-25 21:41 '12 at 21:41 pm 2012-09-25 21:41

JavaScript-də Null və Undefined Abyss araşdırmaq məqalədə , Mən Underscore.js kimi çərçivələri oxumaq bu funksiyanı istifadə:

 function isUndefined(obj){ return obj === void 0; } 
12
19 дек. Cavab 19 dekabrda Marthijn tərəfindən verilir . 2013-12-19 13:44 '13 saat 13:44 'da 2013-12-19 13:44

'əgər (window.x) {}' bir səhv ilə təhlükəsizdir

Çox güman ki, siz if (window.x) . X x elan edilməmiş olsa belə, bu təhlükəsizdir ( var x; ) - brauzer səhv vermir.

Məsələn: brauzerimin tarixi API'ları dəstəklədiyini bilmək istərdim.

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

Necə işləyir?

Pəncərə , bütün qlobal dəyişənləri öz üzvləri olan bir obyektdir və qeyri-mövcud elementə giriş əldə etməyə cəhd etmək qanuni deyil. X elan edilmədikdə və ya müəyyən edilmədikdə, window.x müəyyən window.x . () qiymətləndirirsə, müəyyən edilməyən səbəblər yalançıdır .

10
10 февр. DenisS 10 fevralda cavab verin 2014-02-10 19:26 '14 at 19:26 2014-02-10 19:26
 "propertyName" in obj //-> true | false 
9
05 мая '14 в 3:13 2014-05-05 03:13 cavab 05 may 2014-cü il saat 03: 13-da verilir

Bunu oxuduqdan sonra mən onu görmədimdən təəccüblənirəm. Bunun üçün çalışacağam bir neçə alqoritm tapdım.

Heç vaxt müəyyən edilmədi

Obyektin dəyəri heç vaxt müəyyən edilməmişsə, bu, undefined və ya undefined edilmədikdə true olduğunu qaytarmağa mane olur. Bu, undefined dəyərlərə görə dönmək istəyirsinizsə faydalıdır undefined

 if(obj.prop === void 0) console.log("The value has never been defined"); 

Tanımlanmamış və ya müəyyən edilməmiş olaraq təyin olunur

undefined dəyər ilə müəyyən edilmiş dəyərlər üçün true olmasını istəyirsənsə və ya müəyyənləşdirilməmisinizsə, sadəcə istifadə edə bilərsiniz === undefined

 if(obj.prop === undefined) console.log("The value is defined as undefined, or never defined"); 

Saxta, qeyri-müəyyən, null və ya heç müəyyən edilməmiş olaraq təyin olunur.

Bir qayda olaraq, insanlar mənə alqoritm inkişaf etdirməyi xahiş edirdilər, əgər dəyər yalan, undefined və ya null olarsa. Aşağıdakı iş.

 if(obj.prop == false || obj.prop === null || obj.prop === undefined) { console.log("The value is falsy, null, or undefined"); } 
9
15 февр. Cavab 15 fevral tarixində Travis tərəfindən verilir . 2015-02-15 06:10 '15, 6:10 'da 2015-02-15 06:10

Aşağıdakı kodu istifadə edərək, yolu istifadə edərək, bütün unrefined bir sıra əldə edə bilərsiniz.

  function getAllUndefined(object) { function convertPath(arr, key) { var path = ""; for (var i = 1; i < arr.length; i++) { path += arr[i] + "->"; } path += key; return path; } var stack = []; var saveUndefined= []; function getUndefiend(obj, key) { var t = typeof obj; switch (t) { case "object": if (t === null) { return false; } break; case "string": case "number": case "boolean": case "null": return false; default: return true; } stack.push(key); for (k in obj) { if (obj.hasOwnProperty(k)) { v = getUndefiend(obj[k], k); if (v) { saveUndefined.push(convertPath(stack, k)); } } } stack.pop(); } getUndefiend({ "": object }, ""); return saveUndefined; } 

jsFiddle link

8
17 окт. Anoop tərəfindən 17 oktyabrda verilən cavab 2011-10-17 14:22 '11 'də saat 14:22 ' da 2011-10-17 14:22

Qərar səhvdir. Javascriptdə

 null == undefined 

Çünki hər ikisi bir "boolean dəyər" üçün "qaldırılır" və yalan hesab olunur. Düzgün yol yoxlamaqdır

 if (something === undefined) 

kimlik operatorudur ...

7
26 авг. Ricky 26 aug tərəfindən verilmiş cavab 2008-08-26 15:38 '08 at 15:38 2008-08-26 15:38

Səbir üçün void 0 müqayisə edin.

 if (foo !== void 0) 

Bu qədər deyil if (typeof foo !== 'undefined')

7
02 янв. cavab bevacqua verilir 02 yanvar. 2014-01-02 15:59 '14 at 15:59 2014-01-02 15:59

Yalnız bir şey JavaScript-də müəyyən edilməmişdir, müəyyən deyil, obyektin / Array daxilində bir əmlak olub olmadığını və ya bir dəyişən kimi əhəmiyyəti yoxdur ...

JavaScript-də, müəyyənləşdirilməyən bir dəyişənin aşkarlanmasını asanlaşdıran bir typeof var.

Yalnızca typeof whatever === 'undefined' və boolean dəyəri qaytaracaq yoxlayın.

Вот как isUndefined() знаменитая функция isUndefined() в AngularJs v.1x:

 function isUndefined(value) {return typeof value === 'undefined';} 

Итак, как вы видите, функция получает значение, если это значение определено, она вернет false , в противном случае для неопределенных значений вернет true .

Итак, давайте посмотрим, какими будут результаты, когда мы передадим значения, включая свойства объекта, как показано ниже, это список переменных, которые у нас есть:

 var stackoverflow = {}; stackoverflow.javascipt = 'javascript'; var today; var self = this; var num = 8; var list = [1, 2, 3, 4, 5]; var y = null; 

и мы проверяем их, как показано ниже, вы можете увидеть результаты перед ними в качестве комментария:

 isUndefined(stackoverflow); //false isUndefined(stackoverflow.javascipt); //false isUndefined(today); //true isUndefined(self); //false isUndefined(num); //false isUndefined(list); //false isUndefined(y); //false isUndefined(stackoverflow.java); //true isUndefined(stackoverflow.php); //true isUndefined(stackoverflow  stackoverflow.css); //true 

Как вы видите, мы можем проверить что угодно, используя что-то подобное в нашем коде, как уже упоминалось, вы можете просто использовать typeof в своем коде, но если вы используете его снова и снова, создайте функцию, подобную угловой выборке, которую я разделяю, и продолжаю использовать повторно. как следующий шаблон кода DRY.

Также еще одна вещь, для проверки свойства объекта в реальном приложении, в котором вы не уверены, существует ли этот объект или нет, сначала проверьте, существует ли объект.

Если вы проверите свойство объекта и объект не существует, вы получите ошибку и остановите работу всего приложения.

 isUndefined(x.css); VM808:2 Uncaught ReferenceError: x is not defined(…) 

Настолько просто, что вы можете заключить в оператор if, как показано ниже:

 if(typeof x !== 'undefined') { //do something } 

Что также равно isDefined в Angular 1.x...

 function isDefined(value) {return typeof value !== 'undefined';} 

Также другие фреймворки javascript, такие как подчеркивание, имеют аналогичную проверочную проверку, но я рекомендую вам использовать typeof если вы уже не используете фреймворки.

Я также добавляю этот раздел из MDN, в котором есть полезная информация о typeof, undefined и void (0).

Строгое равенство и неопределенность
Вы можете использовать неопределенные и строгие операторы равенства и неравенства, чтобы определить, имеет ли переменная значение. В следующем коде переменная x не определена, а оператор if оценивается как true.

 var x; if (x === undefined) { // these statements execute } else { // these statements do not execute } 

Примечание: здесь должен использоваться оператор строгого равенства, а не стандартный оператор равенства, потому что x == undefined также проверяет, является ли x нулевым, а строгое равенство - нет. ноль не эквивалентно неопределенному. Смотрите операторы сравнения для деталей.


Тип оператора и неопределенный
В качестве альтернативы typeof может быть использован:

 var x; if (typeof x === 'undefined') { // these statements execute } 

Одной из причин использования typeof является то, что он не выдает ошибку, если переменная не была объявлена.

 // x has not been declared before if (typeof x === 'undefined') { // evaluates to true without errors // these statements execute } if (x === undefined) { // throws a ReferenceError } 

Тем не менее, этот вид техники следует избегать. JavaScript является статически ограниченным языком, поэтому, зная, объявлена ли переменная, можно прочитать, проверив, объявлена ли она в окружающем контексте. Единственное исключение - глобальная область, но глобальная область привязана к глобальному объекту, поэтому проверка существования переменной в глобальном контексте может быть выполнена путем проверки наличия свойства в глобальном объекте (используя оператор in, например).


Пустой оператор и неопределенный

Оператор void является третьей альтернативой.

 var x; if (x === void 0) { // these statements execute } // y has not been declared before if (y === void 0) { // throws a ReferenceError (in contrast to 'typeof') } 

больше> здесь

7
ответ дан Alireza 24 мая '17 в 17:15 2017-05-24 17:15

Вот моя ситуация:

Я использую результат вызова REST. Результат должен быть проанализирован с JSON на объект JavaScript.

Есть одна ошибка, которую мне нужно защитить. Если аргументы для остальных вызовов были неправильными, поскольку пользователь, указав неверные аргументы, остальной вызов возвращается в основном пустым.

Используя этот пост, чтобы помочь мне защититься от этого, я попробовал это.

 if( typeof restResult.data[0] === "undefined" ) { throw "Some error"; } 

В моей ситуации, если restResult.data [0] === "object", то я могу спокойно начать проверку остальных членов. Если undefined затем выбросить ошибку, как указано выше.

Я говорю, что для моей ситуации все предложения, приведенные выше в этом сообщении, не работали. Я не говорю, что я прав, и все ошибаются. Я вообще не мастер JavaScript, но, надеюсь, это поможет кому-то.

6
ответ дан wayneseymour 15 авг. '13 в 16:56 2013-08-15 16:56

Существует красивый и элегантный способ присвоить заданное свойство новой переменной, если он определен или присвоить значение по умолчанию для него как резервную, если это undefined.

 var a = obj.prop || defaultValue; 

Это подходит, если у вас есть функция, которая получает дополнительное свойство конфигурации:

 var yourFunction = function(config){ this.config = config || {}; this.yourConfigValue = config.yourConfigValue || 1; console.log(this.yourConfigValue); } 

Теперь выполнение

 yourFunction({yourConfigValue:2}); //=> 2 yourFunction(); //=> 1 yourFunction({otherProperty:5}); //=> 1 
6
ответ дан Marian Klühspies 03 марта '16 в 13:05 2016-03-03 13:05

Если вы используете Angular:

 angular.isUndefined(obj) angular.isUndefined(obj.prop) 

Underscore.js:

 _.isUndefined(obj) _.isUndefined(obj.prop) 
5
ответ дан Vitalii Fedorenko 15 дек. '14 в 1:35 2014-12-15 01:35

Просматривая комментарии, для тех, кто хочет проверить оба, это undefined или его значение равно null:

 //Just in JavaScript var s; // Undefined if (typeof s == "undefined" || s === null){ alert('either it is undefined or value is null') } 

Если вы используете библиотеку jQuery, тогда для обоих случаев будет достаточно jQuery.isEmptyObject() ,

 var s; // Undefined jQuery.isEmptyObject(s); // Will return true; s = null; // Defined as null jQuery.isEmptyObject(s); // Will return true; //Usage if (jQuery.isEmptyObject(s)) { alert('Either variable:s is undefined or its value is null'); } else { alert('variable:s has value ' + s); } s = 'something'; // Defined with some value jQuery.isEmptyObject(s); // Will return false; 
5
ответ дан Angelin Nadar 08 июля '14 в 11:19 2014-07-08 11:19

Я использую if (this.variable) для проверки, если он определен. Простой if (variable) , рекомендованный выше , не подходит для меня. Оказывается, он работает только тогда, когда переменная является полем какого-либо объекта, obj.someField , чтобы проверить, определено ли это в словаре. Но мы можем использовать this или window как объект словаря, поскольку любая переменная является полем в текущем окне, как я понимаю. Поэтому здесь есть тест

5
ответ дан Val 06 марта '15 в 18:58 2015-03-06 18:58

Все ответы неполны. Это правильный способ узнать, что существует свойство "определено как undefined":

 var hasUndefinedProperty = function hasUndefinedProperty(obj, prop){ return ((prop in obj)  (typeof obj[prop] == 'undefined')) ; } ; 

Məsələn:

 var a = { b : 1, e : null } ; ac = ad ; hasUndefinedProperty(a, 'b') ; // false : b is defined as 1 hasUndefinedProperty(a, 'c') ; // true : c is defined as undefined hasUndefinedProperty(a, 'd') ; // false : d is undefined hasUndefinedProperty(a, 'e') ; // false : e is defined as null // And now... delete ac ; hasUndefinedProperty(a, 'c') ; // false : c is undefined 

Слишком плохо, что это был правильный ответ, похоронен в неправильных ответах > _ <

Итак, для всех, кто проходит мимо, я дам вам undefineds бесплатно!!

 var undefined ; undefined ; // undefined ({}).a ; // undefined [].a ; // undefined ''.a ; // undefined (function(){}()) ; // undefined void(0) ; // undefined eval() ; // undefined 1..a ; // undefined /a/.a ; // undefined (true).a ; // undefined 
5
ответ дан Juan Garcia 18 июня '14 в 8:21 2014-06-18 08:21
 function isUnset(inp) { return (typeof inp === 'undefined') } 

Возвращает false, если задана переменная, а true, если undefined.

Затем используйте:

 if (isUnset(var)) { // initialize variable here } 
4
ответ дан Rixius 12 июля '10 в 23:54 2010-07-12 23:54

То же самое можно записать короче:

 if (!variable){ //do it if variable is Undefined } 

və ya

 if (variable){ //do it if variable is Defined } 
3
ответ дан raskalbass 16 июня '14 в 15:15 2014-06-16 15:15

Я хотел бы показать вам что-то, что я использую, чтобы защитить переменную undefined :

 Object.defineProperty(window, 'undefined', {}); 

Это запрещает любому изменять значение window.undefined , тем самым уничтожая код на основе этой переменной. Если вы используете "use strict" , все, что пытается изменить его значение, закончится ошибкой, в противном случае оно будет игнорироваться.

3
ответ дан Seti 09 окт. '14 в 11:09 2014-10-09 11:09

Я предлагаю три способа для тех, кто ожидает странных @:

2
ответ дан blackmiaool 28 окт. '17 в 12:24 2017-10-28 12:24

От lodash.js.

 var undefined; function isUndefined(value) { return value === undefined; } 

Он создает LOCAL переменную с именем undefined которая инициализируется значением по умолчанию - реальным undefined , а затем сравнивает value с переменной undefined .

2
ответ дан lzl124631x 14 янв. '16 в 8:43 2016-01-14 08:43
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос