Javascriptdə "undefined" -i necə yoxlamaq olar?

Değişkenin javascript içinde tanımlanmadığını kontrol etmenin ən uygun yolu nedir? Bir neçə mümkün yol gördüm:

 if (window.myVariable) 

və ya

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

və ya

 if (myVariable) //This throws an error if undefined. Should this be in Try/Catch? 
1987
02 авг. təsadüfi 65537 tərəfindən təyin 02 aug. 2010-08-02 20:53 '10 at 20:53 2010-08-02 20:53
@ 16 cavab

Bir dəyişənin dəyərindən asılı olmayaraq müəyyən olub olmadığını tapmaq istəyirsinizsə in operatorda istifadə etmək ən təhlükəsiz üsuldur. Bu nümunəni nəzərdən keçirin.

 // global scope var theFu; // theFu has been declared, but its value is undefined typeof theFu; // "undefined" 

Lakin bu, bəzi hallarda nəzərdə tutulan nəticə ola bilməz, çünki dəyişən və ya əmlak elan edilmişdi, amma sadəcə olaraq başlanmadı. Daha etibarlı yoxlama üçün operatordan istifadə edin.

 "theFu" in window; // true "theFoo" in window; // false 

Bir dəyişənin müəyyənləşdirildiyini və ya undefined typeof , typeof operatorunu istifadə edin.

 if (typeof myVar !== 'undefined') 

typeof operatoru bir simli qaytarmaq üçün təmin edilir. Belirlenmemiş birbaşa müqayisə undefined - undefined olduğundan undefined müəyyəndir.

 window.undefined = "omg"; "omg" == undefined // true 

@CMS qeyd etdiyimiz kimi, bu ECMAScript 5-ci bənddə müəyyən edilmişdir və undefined qeyd undefined .

if (window.myVar) bu yanlış dəyərləri də daxil edərsə, bu da çox sabit deyildir:

 yanlış 0 "" NaN null undefined

Üçüncü halın - if (myVariable) iki vəziyyətdə də if (myVariable) səhv ola biləcəyi üçün if (myVariable) . Birincisi, ReferenceError adlı bir dəyişən müəyyən edilmədikdə.

 // abc was never declared. if (abc) { // ReferenceError: abc is not defined } 

Başqa bir vəziyyət bir dəyişən müəyyən edildikdə, ancaq çağırışda bir səhv meydana gətirən getter funksiyası vardır. Məsələn,

 // or it a property that can throw an error Object.defineProperty(window, "myVariable", { get: function() { throw new Error("W00t?"); }, set: undefined }); if (myVariable) { // Error: W00t? } 
2246
02 авг. Cavab Anurag 02 avqustda verilir. 2010-08-02 20:58 '10 at 20:58 2010-08-02 20:58

Şəxsən mən istifadə edirəm

 myVar === undefined 

Qeyd: === yuxarıda == istifadə olunur və myVar əvvəlcədən bildirilmişdir (müəyyən edilməmişdir).


typeof myVar === "undefined" . Hesab edirəm ki, bu, uzun və lazımsızdır. (Kiçik kodla eyni şeyi edə bilərəm.)

İndi bəzi insanlar oxuyarkən ağrı ilə bişirəcəklər, qışqırırlar: "Bekle! WAAITTT! Undefined ləğv edilə bilər!"

Sərin. Bunu bilirəm. Yenə, Javascriptdakı dəyişənlərin əksəriyyəti ləğv edilə bilər. Heç vaxt əsassız ola biləcəyiniz daxili tanıdan istifadə edirsiniz?

Əgər bu qaydaya əməl etsəniz, sizin üçün yaxşıdır: siz münafiq deyilsiniz.

Faktiki olaraq, JS-də bir çox real iş aparmaq üçün, developers onlar kim olduğu üçün yenidən müəyyən identifikatorlara etibar etməlidirlər. İnsanlar mənə setTimeout istifadə setTimeout lazım olduğunu setTimeout , çünki kimsə bilər

 window.setTimeout = function () { alert("Got you now!"); }; 

Aşağı xətt, argument "it can not be overridden", raw === undefined istifadə etmək üçün, dummy edir.

border=0

(Əgər hələ də undefined qorxursan, niyə sınanmamış kitabxana kodunu kod bazasına daxil edirsən? Ya da daha sadə: bir köçürmə aləti.)


Bundan əlavə, typeof metodu kimi, bu metod açıqlanmayan dəyişənləri "aşkar" edə bilər:

 if (window.someVar === undefined) { doSomething(); } 

Amma bu texnologiyaların hər ikisi öz abstraksiyalarına sızdılar. Mən onu və ya hətta istifadə etməyinizi istəmirəm

 if (typeof myVar !== "undefined") { doSomething(); } 

Düşün:

 var iAmUndefined; 

Bu dəyişənin elan olunub-edilmədiyini öyrənmək üçün operatorda əlaqə saxlamanız tələb oluna bilər. (Bir çox hallarda, sadəcə O_o kodunu oxuya bilərsiniz).

 if ("myVar" in window) { doSomething(); } 

Ancaq gözləyin! Hələ var! Bir növ prototipik sehrli zəncir meydana gəlsə ... İndi operatorun hətta yuxarı olması kifayət deyil. (Tamam, bu hissəni burada bitirdim, istisna olmaqla 99% halda === undefined (və **** öskürək **** typeof ) yaxşı işləyir. Həqiqətən, qayğı yoxdur, bu mövzu haqqında oxuya bilərsiniz özünüzü.)

938
02 авг. Tomas Edinqə Aug 02-də cavab verin 2010-08-02 21:26 '10 at 21:26 2010-08-02 21:26

typeof istifadə mənim typeof . Değişken, heç bir zaman elan edilmediğinde, == və ya === operatörleriyle müqayisədə və ya zorla istifadə etməli olduğunda işləyəcək. ECMAScript 3 və ya daha yüksək səviyyələrə uyğun olsa da, nərddən fərqli olaraq, ECMAScript 3 mühitində əvəzsizdir, müqayisədə etibarsız hala gətirir.

 if (typeof someUndeclaredVariable == "undefined") { // Works } if (someUndeclaredVariable === undefined) { // Throws an error } 
158
02 авг. Cavab Tim Down 02 avqustda verilir. 2010-08-02 21:05 '10 at 21:05 2010-08-02 21:05

Siz typeof istifadə typeof .

 if (typeof something != "undefined") { // ... } 
54
06 июня '10 в 23:22 2010-06-06 23:22 Cavab Yaqub Relkin tərəfindən 06 iyun '09 23:22 'də verildi 2010-06-06 23:22

Bu təsəvvür deyilsə, simli undefined olduğundan, simvolları "undefined" olan simli bərabər olmayacaq.

Dəyişənlərin növünü yoxlaya bilərsiniz:

 if (typeof(something) != "undefined") ... 

Bəzən tipi yoxlamaq lazım deyil. Bir dəyişənin dəyəri təyin olunduqda yanlış qiymətləndirilə bilməzsə (məsələn, funksiya varsa), sadəcə dəyişənliyi qiymətləndirə bilərsiniz. Məsələn:

 if (something) { something(param); } 
20
06 июня '10 в 23:23 2010-06-06 23:23 Guffa tərəfindən verilən cavab 06 iyun 'da saat 11:23 ' da 2010-06-06 23:23

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

( var istifadə edərək, bükülmüş ərazidə olduğu zaman mənalıdır)

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 
17
13 янв. Cavab yanvarın 13-də verilir 2013-01-13 18:39 '13 at 6:39 2013-01-13 18:39
 if (typeof foo == 'undefined') { // Do something }; 

Qeyd edək ki, bu halda ciddi bir müqayisə tələb olunmur ( !== ), çünki typeof hər zaman bir simli dönəcəkdir.

16
06 июня '10 в 23:26 2010-06-06 23:26 06 iyun 10: 23-də Matias Bynensə cavab verib 2010-06-06 23:26

2018-07-25 yeniləmə

Bu mesajın yaradılmasından bəri beş il keçdi və JavaScript uzun bir yol gəldi. Orijinal yazıdakı testləri təkrarlayarkən aşağıdakı test üsulları arasında sabit bir fərq tapmadım:

  • abc === undefined
  • abc === void 0
  • typeof abc == 'undefined'
  • typeof abc === 'undefined'

Onların optimallaşdırılmasını maneə törətmək üçün testləri dəyişdikdə, fərqlər kiçik idi. Buna görə, mən abc === undefined aydınlıq üçün abc === undefined məsləhətdir.

chrome://version müvafiq məzmun:

  • Google Chrome: 67.0.3396.99 (rəsmi qurma) (64 bit) (kohort: sabit)
  • Version: a337fbf3c2ab8ebc6b64b0bfdce73a20e2e2252b-refs / branch-heads / 3396 @ {# 790}
  • OS: Windows
  • JavaScript: V8 6.7.288.46
  • User agenti: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, məsələn, Gecko) Chrome / 67.0.3396.99 Safari / 537.36

Orijinal yazı 2013-11-01

Google Chrome-da aşağıdakı typeof testindən bir qədər daha sürətli idi:

 if (abc === void 0) { // Undefined } 

Fərqi əhəmiyyətsiz idi. Ancaq bu kod, 0 sayının void 0 kimin bildiyi baxımından daha qısa və aydındır. Buna baxmayaraq, abc hələ də elan edilməlidir.

Hər iki typeofvoid birbaşa undefined birbaşa müqayisədə əhəmiyyətli dərəcədə daha sürətli idi. Chrome geliştirici konsolunda aşağıdakı test formatını istifadə etdim:

 var abc; start = +new Date(); for (var i = 0; i < 10000000; i++) { if (TEST) { void 1; } } end = +new Date(); end - start; 

Nəticələr aşağıdakı kimidir:

 Test: | abc === undefined abc === void 0 typeof abc == 'undefined' ------+--------------------------------------------------------------------- x10M | 13678 ms 9854 ms 9888 ms x1 | 1367.8 ns 985.4 ns 988.8 ns 

Birinci xəttin millisaniyədək olduğuna və ikincisi nanosaniyadır. 3.4 nanosaniyadakı fərq heç bir şey deyil. Müddəti sonrakı sınaqlarda olduqca ardıcıl idi.

15
01 нояб. cavab Zenexer 01 tövsiyə verilir . 2013-11-01 07:52 '13 saat 07:52 'da 2013-11-01 07:52

Bu yazıda Underscore.js kimi çərçivələri oxudum bu funksiyanı istifadə edir:

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

undefined yoxlanmanın ən etibarlı yolu void 0 .

Yaşlı və köhnə brauzerlər ilə uyğun gəlir və məsələn, window.undefined kimi window.undefined .

 if( myVar === void 0){ //yup it undefined } 
10
19 февр. Jozef Gabriel tərəfindən 19 Fevralda cavab verildi 2014-02-19 16:20 '14 saat 16:20 'da 2014-02-19 16:20

Şəxsən mən həmişə aşağıdakıları istifadə edirəm:

 var x; if( x === undefined) { //Do something here } else { //Do something else here } 

Window.undefined xüsusiyyət bütün müasir brauzerlərdə yazılamaz (JavaScript 1.8.5 və ya daha yeni). Mozilla sənədlərindən: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined , mən aşağıdakıları görürəm: typeof () istifadə edilməsinin səbəblərindən biri səhv yaratmır dəyişən müəyyən edilmədiyində.

Mən yanaşmanı istifadə etməliyəm

 x === undefined 

çünki mənim üzümdə uğursuz və partlayır və x əvvəllər açıqlanmırsa səssizcə keçməyəcəkdir. Bu mənə xəbərdarlıq edir ki, x elan edilmir. Hesab edirəm ki, javascriptdə istifadə olunan bütün dəyişənlər elan edilməlidir.

9
20 дек. Cavab Hrishi tərəfindən verilir 20 dekabr. 2013-12-20 13:24 13:13, 13:24 2013-12-20 13:24

Cavabların heç biri mənə kömək etmədiyinə görə bunu təklif edirəm. Bu, Internet Explorer 8-də mənim üçün çalışdı:

 if (typeof variable_name.value === 'undefined') { // variable_name is undefined } 
4
22 нояб. Cavab verildi anmarti 22 noyabr. 2012-11-22 19:47 '12 at 7:47 pm 2012-11-22 19:47

Cavabın əksinə @Thomas Eding:

Mənim myVar bəyan etməyi myVar , mənim myVar is not defined .

Həqiqi bir nümunə götürün:

Mən dəyişən ad var, amma əmin deyiləm ki, bir yerdə və ya elan edilmir.

Sonra @Anurag cavab kömək edəcək:

 var myVariableToCheck = 'myVar'; if (window[myVariableToCheck] === undefined) console.log("Not declared or declared, but undefined."); // Or you can check it directly if (window['myVar'] === undefined) console.log("Not declared or declared, but undefined."); 
3
13 апр. Cavab 13 aprel tarixində Vikas tərəfindən verilmişdir. 2013-04-13 07:49 '13 saat 07:49 2013-04-13 07:49
 // x has not been defined before if (typeof x === 'undefined') { // Evaluates to true without errors. // These statements execute. } if (x === undefined) { // Throws a ReferenceError } 
3
08 авг. Cavab 08 avqustda mənbə kodu verilir . 2014-08-08 10:09 '14 at 10:09 2014-08-08 10:09
  var x; if (x === undefined) { alert ("I am declared, but not defined.") }; if (typeof y === "undefined") { alert ("I am not even declared.") };  // Will repeat above logic of x for typeof === 'undefined' if (x === undefined) { alert ("I am declared, but not defined.") };   if (z === undefined) { alert ("I am neither declared nor defined.") }; // I got this error for z ReferenceError: z is not defined 
1
04 марта '14 в 21:37 2014-03-04 21:37 Cavab Gaurav tərəfindən 04 Mart '14 'də saat 21:37' də veriləcək 2014-03-04 21:37

Funksiyanı parametr kimi istifadə edirəm və funksiyanı yerinə yetirərkən istisna etmirəm ki, mən "real" müəyyənləşdirilməmişəm. Bu funksiyanın içərisində kodun daxil edilməsini tələb etsə də. JQuery mənbəyini oxuduğunda bunu tapdım.

 undefined = 2; (function (undefined) { console.log(undefined); // prints out undefined // and for comparison: if (undeclaredvar === undefined) console.log("it works!") })() 

Əlbəttə, yalnız typeof istifadə typeof . Amma kodumun bütünü adətən bir funksiyanın içərisindədir, buna görə də bu metodu istifadə edərək, məni burada və orada bir neçə bayt saxlayacaqdır.

0
02 авг. Cavab Cristian Sanchez 02 avqustda verilir. 2010-08-02 21:02 '10 at 21:02 2010-08-02 21:02

tags ilə bağlı digər suallar və ya bir sual