Değişken === undefined void typeof değişken === "undefined"

JQuery Core Stil Qaydaları bir dəyişənin müəyyənləşdirildiyini yoxlamaq üçün iki müxtəlif yol təqdim edir.

  • Qlobal dəyişənlər: typeof variable === "undefined"
  • Yerli dəyişənlər: variable === undefined
  • Properties: object.prop === undefined

Niyə jQuery qlobal dəyişənlər üçün bir yanaşma, digəri yerli və xüsusiyyətlər üçün istifadə edir?

236
18 янв. Patrick McElhaney 18 yanvar istəndi . 2011-01-18 18:02 '11 at 18:02 2011-01-18 18:02
@ 8 cavab

typeof foo dəyişənlər üçün, typeof foo "undefined" typeof foo çıxaracaq foo === undefined identifikatorunu yoxlamaqla simli literal "undefined" dir.

Yerli dəyişənlər üçün (bildiyiniz kimi, bir yerdə elan edilir) belə bir səhv baş vermir, buna görə də şəxsiyyət yoxlaması.

295
18 янв. Linus Kleen tərəfindən verilmiş cavab 18 yanvar 2011-01-18 18:10 '11 at 18:10 2011-01-18 18:10

Mən hər yerdə typeof foo === "undefined" istifadə typeof foo === "undefined" . Heç vaxt yanlış getməyəcək.

JQuery'nin iki fərqli üsul təklif etdiyinin səbəbini təqdim edirəm: jQuery kodunun yaşandığı funksiya daxilində öz undefined dəyişənini undefined , buna görə də bu funksiya daxilində undefined xarici müdaxilədən təhlükəsizdir. Mən də düşünürəm ki, kimsə bir yerdə iki fərqli yanaşma müqayisə edir və foo === undefined daha tez foo === undefined və buna görə də bu yola qərar verdi. [YENİLİK: şərhlərdə qeyd edildiyi kimi, undefined müqayisə də bir qədər qısadır ki, bu da nəzərdən keçirilə bilər.] Amma praktiki vəziyyətlərdə əldə edilən mənfəət tamamilə əhəmiyyətsizdir: bu test heç vaxt bir darboğaz olmayacaq və bu, itirmək çox vacibdir: obyekt obyektinin xüsusiyyətlərini qiymətləndirmək, müqayisə ediləcək bir səhv gətirə bilər, halbuki typeof heç vaxt yoxlanıla bilməz.

Məsələn, IE-də aşağıdakıları xülasə etmək üçün istifadə olunur:

 var x = new ActiveXObject("Microsoft.XMLDOM"); 

Bir loadXML metoduna etibarlı olub olmadığını yoxlamaq üçün:

 typeof x.loadXML === "undefined"; // Returns false 
border=0

Digər tərəfdən:

 x.loadXML === undefined; // Throws an error 

ƏLAVƏ OLUNUB

typeof yoxlamanın bir üstünlüyü, mən də xatırlamadığımı unutmuşam ki, foo === undefined tərəfindən foo === undefined edilməyən undeclared dəyişənlərlə işləyir və əslində ReferenceError ı salır. Mənə xatırlatmaq üçün @LinusKleen təşəkkür edirəm. Məsələn:

 typeof someUndeclaredVariable; // "undefined" someUndeclaredVariable === undefined; // throws a ReferenceError 

Bottom line: həmişə typeof yoxlamasından istifadə edin.

104
18 янв. Cavab Jan 18 tərəfindən Tim Down tərəfindən verilir 2011-01-18 19:05 '11 saat 19:05 'da 2011-01-18 19:05

Seçim növündən istifadə etmək üçün başqa bir səbəb: undefined ləğv edilə bilər.

 undefined = "foo"; var variable = "foo"; if (variable === undefined) console.log("eh, what?!"); 

typeof variable nəticəsi ola bilməz.

Yeniləmə : Xahiş edirik, bu ES5-ə tətbiq edilmir.

25
18 янв. Yanuk Jan 18 tərəfindən verilmiş cavab 2011-01-18 20:08 '11 at 20:08 2011-01-18 20:08

Çünki undefined həmişə elan deyil, lakin jQuery onun əsas funksiyası ilə undefined bəyan edir. Beləliklə, onlar təhlükəsiz olmaq üçün təhlükəsizlik typeof istifadə edirlər, amma içərisində təhlükəsiz undefined typeof dəyəri istifadə edirlər.

5
18 янв. Cavab 18 yanvar Struppi tərəfindən verilir 2011-01-18 18:09 '11 at 18:09 2011-01-18 18:09

variable === undefined performansını artırmak isteyen herkes burada bir göz atabilir, ancaq bu, yalnız Chrome optimizasyonu.

5
19 февр. Cavab RİZKİ 19 fevralda verilir. 2014-02-19 14:06 '14 'da 14:06 2014-02-19 14:06

typeof a === 'undefined' sürətli a === 'undefined' düyməsinə görə 2 dəfə təxminən v6.9.1.

0
22 мая '17 в 12:12 2017-05-22 12:12 Cavab Eduard Popov tərəfindən 22 may 17: 17-da saat 12:12 'də verildi

Yerli dəyişənlər üçün, localVar === undefined ilə yoxlanılmaması üçün müəyyən olunmalıdır, çünki onlar bir yerdə yerli ərazidə müəyyən edilməlidir və ya onlar yerli sayılmayacaqlar.

Yerdə olmayan və hər hansı bir yerdə müəyyənləşdirilməyən dəyişənlər üçün, check someVar === undefined bir istisna atacaq: Hazırlanmayan ReferenceError: j müəyyən deyil

Yuxarıda qeyd etdiyim şeyləri izah edən kod burada. Daha aydınlıq üçün inline şərhlərə diqqət yetirin.

 function f (x) { if (x === undefined) console.log('x is undefined [x === undefined].'); else console.log('x is not undefined [x === undefined.]'); if (typeof(x) === 'undefined') console.log('x is undefined [typeof(x) === \'undefined\'].'); else console.log('x is not undefined [typeof(x) === \'undefined\'].'); // This will throw exception because what the hell is j? It is nowhere to be found. try { if (j === undefined) console.log('j is undefined [j === undefined].'); else console.log('j is not undefined [j === undefined].'); } catch(e){console.log('Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.');} // However this will not throw exception if (typeof j === 'undefined') console.log('j is undefined (typeof(x) === \'undefined\'). We can use this check even though j is nowhere to be found in our source code and it will not throw.'); else console.log('j is not undefined [typeof(x) === \'undefined\'].'); }; 

Əgər yuxarıda göstərilən kodu zəng etsək:

 f(); 

Çıxış aşağıdakı kimi olacaq:

 x is undefined [x === undefined]. x is undefined [typeof(x) === 'undefined']. Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code. j is undefined (typeof(x) === 'undefined'). We can use this check even though j is nowhere to be found in our source code and it will not throw. 

Əgər yuxarıdakı kodu bu şəkildə (hər hansı bir faktiki dəyərlə) çağırırıqsa:

 f(null); f(1); 

Çıxış olacaq:

 x is not undefined [x === undefined]. x is not undefined [typeof(x) === 'undefined']. Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code. j is undefined (typeof(x) === 'undefined'). We can use this check even though j is nowhere to be found in our source code and it will not throw. 

typeof x === 'undefined' aşağıdakı kimi yerinə yetirdikdə: typeof x === 'undefined' , əsasən bu haqda xahiş edirik: x dəyişən typeof x === 'undefined' olmadığını yoxlayın. (daha çox və ya daha az). C # və ya Java'yı bilirsinizsə, bu cür doğrulama heç vaxt yerinə yetirilmir, çünki mövcud deyilsə, kompilyasiya edilməyəcəkdir.

<== Fiddle Me ==>

0
09 окт. Cavab CodingYoshi 09 oktyabrda verilir . 2017-10-09 00:55 '17 at 0:55 2017-10-09 00:55

Xülasə:

Qlobal miqyasda, həqiqətən, dəyişən elan edilmədiyində və ya dəyəri undefined edilmədikdə, həqiqətən, həqiqətə dönmək istəyirik:

 var globalVar1; console.log(typeof globalVar1 === 'undefined'); console.log(typeof globalVar2 === 'undefined'); 

Bunun səbəbi, typeof operator dəyişən elan edilmədikdə və ya hazırda biz istədiyimiz tam undefined dəyəri olan ehtiva edildikdə simli typeof geri qaytarır.


  • Yerli dəyişənlərlə bu problem yoxdur, çünki biz bu dəyişənin mövcud olacağını əvvəlcədən bilirik. Dəyişən mövcud olduqda müvafiq funksiyaya baxmaq olar.
  • Obyekt xüsusiyyətləri ilə bu problemimiz yoxdur, çünki mövcud olmayan bir obyektin mülkiyyətini tapmağa çalışdıqda, biz də dəyərini undefined

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