Javascriptdə undefined və ya null dəyişənliyi necə yoxlamaq olar?

Biz tez-tez javascript kodumuzda aşağıdakı kodu istifadə edirik

 if (typeof(some_variable) != 'undefined'  some_variable != null) { // Do something with some_variable } 

Həmin təsiri yoxlamaq üçün daha az müəyyən bir yol varmı?

Bəzi forumlara və ədəbiyyata uyğun olaraq, aşağıdakıları eyni təsir göstərməlidir.

 if (some_variable) { // Do something with some_variable } 

Təəssüf ki, Firebug , some_variable qeyri-müəyyən olduqda, some_variable , bir run-time səhv kimi bir bəyanatı qiymətləndirir. Bu yalnız Firebugun (istenmeyen) davranışı mı və ya iki üsul arasındakı fərq varmı?

414
01 апр. Tomas Vana 01 apr. 2010-04-01 12:17 '10 at 12:17 2010-04-01 12:17
@ 16 cavab

İki haldan fərqli olmalıdır:

  1. foo kimi qeyri-müəyyən dəyişənlər. typeof dan başqa hər hansı bir kontekstdə müəyyənləşdirilməyən bir dəyişənə daxil olmağınız halında bir səhv typeof .

     if(typeof someUndefVar == whatever) // works if(someUndefVar) // throws error 

    Buna görə typeof dəyişənlər üçün doğrulama tələb olunur. Digər tərəfdən, bu nadir hallarda tələb olunur - adətən dəyişənlərin müəyyənləşdirilib-edilmədiyini bilirsiniz.

  2. someExistingObj.someUndefProperty kimi müəyyən edilməmiş xassələr. Belirlenemeyen bir özellik bir səhv vermir və sadəcə bir dəyər mənbəyinə çevrildiyi zaman dəyərin false undefined . Beləliklə, 0if(obj.undefProp) , if(obj.undefProp) istifadə edin. Bu həqiqətə əsaslanan ümumi bir deyim var:

     value = obj.prop || defaultValue 

    " defautValue , bir value atar, aksi defautValue üçün defautValue " defautValue .

    Bəzi insanlar bu davranışı çaşqın vəziyyətdə tapır və bu, çətin tapıla bilən səhvlərə gətirib çıxarır və bunun yerine operatorda istifadə etməyi tövsiyə edir.

     value = ('prop' in obj) ? obj.prop : defaultValue 
295
01 апр. cavab user187291 01 apr tərəfindən verilir . 2010-04-01 12:54 '10 at 12:54 2010-04-01 12:54

Hesab edirəm ki, test üçün ən effektiv yol "dəyərsizdir və ya undefined "

 if ( some_variable == null ){ // some_variable is either null or undefined } 

Beləliklə, bu iki xətt bərabərdir:

 if ( typeof(some_variable) !== "undefined"  some_variable !== null ) {} if ( some_variable != null ) {} 

Qeyd 1

some_variable qeyd edildiyi kimi, qısa variant some_variable elan edilməsini tələb edir, əks halda ReferenceError çağırılacaqdır. Ancaq bir çox hallarda istifadənin təhlükəsiz olduğu ehtimal edilir:

əlavə dəlilləri yoxlayın:

 function(foo){ if( foo == null ) {...} 

mövcud bir obyektin xüsusiyyətlərini yoxlayın

 if(my_obj.foo == null) {...} 
border=0

Digər tərəfdən, typeof qlobal dəyişənlərlə məşğul ola bilər (yalnız undefined ). Alskiende'nin izah etdiyi kimi, bu hallar yaxşı səbəblərdən asılı olaraq azaldılmalıdır.

Qeyd 2

Bu, hətta daha qısa - seçim ekvivalent deyil:

 if ( !some_variable ) { // some_variable is either null, undefined, 0, NaN, false, or an empty string } 

Beləliklə

 if ( some_variable ) { // we don't get here if some_variable is null, undefined, 0, NaN, false, or "" } 

Qeyd 3

Ümumiyyətlə, == əvəzinə === istifadə etmək məsləhətdir. Təklif olunan həll bu qayda üçün bir istisna deyil. JSHint sözdizimi bu səbəbdən də eqnull seçimini təmin edir.

JQuery stilində :

Güclü bərabərlik yoxlamaları (===) lehinə == istifadə edilməlidir. Yalnız istisna null ilə qeyri-müəyyən və null yoxlanılır.

 // Check for both undefined and null values, for some important reason. undefOrNull == null; 
336
13 апр. Cavab verilir . 2013-04-13 22:44 '13 at 10:44 pm 2013-04-13 22:44

Yararlı bir bərabərlik null yoxlama da müəyyən edilməməsi üçün doğru olacaq.

if (window.variable == null) alert('variable is null or undefined');

2019

47
03 янв. Cavab Semra 03 Jan 2015-01-03 20:44 '15 'də 20:44' də, 2015-01-03 20:44

ES5 və ES6 kimi yeni JavaScript standartlarında, sadəcə deyə bilərsiniz

 > Boolean(0) //false > Boolean(null) //false > Boolean(undefined) //false 

Python-da boş dəyişənlərin yoxlanmasına bənzəyən bütün səhvlər qaytarılır. Buna görə, bir dəyişən ətrafında şərti məntiq yazmaq istəyirsinizsə, demək

 if (Boolean(myvar)){ // Do something } 

burada "null" və ya "boş string" və ya "undefined" effektiv işlənəcəkdir.

24
05 апр. Naren Yellavula tərəfindən verilmiş cavab 05 Apr 2016-04-05 10:10 '16 saat 10:10 'da 2016-04-05 10:10

Bildirilməmiş dəyişənə istinad etməyə çalışarsanız, bütün JavaScript proqramlarında bir səhv baş verəcəkdir.

Obyektlərin xüsusiyyətləri eyni şərtlərə uymır. Obyektin təsviri müəyyən edilmədikdə, bu istifadə etmək istəyəndə səhv seçilməyəcək. Buna görə, bu vəziyyətdə, aşağı düşə bilərsiniz:

  if (typeof(myObj.some_property) != "undefined"  myObj.some_property != null) 

üçün

 if (myObj.some_property != null) 

Bunu nəzərə alaraq və qlobal dəyişənlərin qlobal bir obyektin xüsusiyyətləri (bir brauzerin vəziyyətində olan window kimi mövcud olması ilə qlobal dəyişənlər üçün aşağıdakıları istifadə edə bilərsiniz:

 if (window.some_variable != null) { // Do something with some_variable } 

Yerli sahələrdə dəyişənlərin kod bloğunun üstündə elan edildiyinə əmin olmaq həmişə faydalıdır, bu, typeof qənaət edir.

18
01 апр. Cavab Andy E 01 apr tərəfindən verilir . 2010-04-01 12:23 '10 at 12:23 2010-04-01 12:23

Birincisi, sınadığınız şeyi dəqiq başa düşməlisiniz. JavaScript sizi söndürmək üçün hər növ gizli dönüşümlərə və iki fərqli bərabərlik komparatoruna malikdir: ===== .

null və ya undefined testlər üçün aşağıdakı xüsusiyyətlərə malik olan test(val) funksiyası:

  test(null) => true test(undefined) => true test(0) => false test(1) => false test(true) => false test(false) => false test('s') => false test([]) => false 

Buradakı fikirlərdən hansı həqiqətən testimizi keçirəcəyik.

Bu işlər:

 val == null val === null || val === undefined typeof(val) == 'undefined' || val == null typeof(val) === 'undefined' || val === null 

Onlar işləmirlər:

 typeof(val) === 'undefined' !!val 

Mən bu yanaşmaların düzgünlüyünü və effektivliyini müqayisə etmək üçün bir jsperf girişini yaratdım. Fərqli brauzerlərdə / platformalarda kifayət qədər qaçış olmadığı üçün nəticələr hələ sübuta yetirilməyib. Kompüterinizdə bir test keçirmək üçün bir dəqiqə çəkin!

Hal-hazırda görünür ki, sadə bir sınaq val == null daha yaxşı performans verir. Bu da ən qısadır. Test əvvəlcədən ləğv edilə bilər val != null bir əlavə etmək istəyirsinizsə.

14
27 февр. Cavab Drew Noakes 27 Fevral. 2014-02-27 15:48 '14 saat 15:48 2014-02-27 15:48

Heç bir tam və düzgün cavab olmadığı üçün ümumiləşdirməyə çalışacağam:

Ümumi vəziyyətdə ifadə:

 if (typeof(variable) != "undefined"  variable != null) 

variable ola bilməz, çünki typeof(variable) != "undefined" ReferenceError ilə nəticələnə bilər. Lakin kontekstə görə ifadəni sadələşdirə bilərsiniz :

variable qlobal olsa, sadələşdirə bilərsiniz:

 if (window.variable != null) 

Yerli olduqda, bu dəyişənin elan edilməmiş hallarda qarşısını almaq və həmçinin asanlaşdırmaq olar:

 if (variable != null) 

Bu bir obyekt mülkiyyəti olursa, ReferenceError haqqında narahatlığınız yoxdur:

 if (obj.property != null) 
4
28 дек. cavab TMS 28 dec tərəfindən verilir . 2013-12-28 22:44 '13 saat 10:44 'da 2013-12-28 22:44

Yalnız vacib olub-olmadığını yoxlaya bilərsiniz. Qiymət

 if( myVariable ) { //mayVariable is not : //null //undefined //NaN //empty string ("") //0 //false } 

Bir dəyişən olub olmadığını bilmirsinizsə (yəni elan edilmişsə), typeof operatoru ilə yoxlayın. məsələn.

 if( typeof myVariable !== 'undefined' ) { // myVariable will get resolved and it is defined } 
4
09 июня '16 в 7:32 2016-06-09 07:32 Cavab DDave tərəfindən 09.06.2013 tarixində 7:32 2016-06-09 07:32 tarixində verilir

Cavablardan birində qeyd edildiyi kimi, qlobal miqyaslı bir dəyişəndən danışarkən şanslı ola bilərsiniz. Bildiyiniz kimi, qlobal səviyyədə müəyyənləşdirən dəyişənlər adətən Windows obyektinə əlavə olunur. Bu həqiqətdən faydalana bilərsiniz, buna görə də dəyişən bleh-ə daxil olduğunuzu bildirin, yalnız cüt ters çevirmə operatorunu (!!) istifadə edin.

 !!window['bleh']; 

Bleh elan olunduqdan və dəyəri təyin olunana qədər bu, yalançıdır.

3
17 апр. Cavab Farax 17 apr verilir . 2014-04-17 04:27 '14 at 4:27 2014-04-17 04:27

Brauzerinizdə geliştirici alətlərini açın və yalnız aşağıda göstərilən kodu göstərin.

2019

27 февр. cavabına Akash Preet verildi 27 Fevral. 2018-02-27 21:01 '18 saat 09: 00'larda 2018-02-27 21:01

Anlamaq üçün, Javascript Engine-in müəyyən edilməmiş null və '' (həmçinin boş bir simli) konvertasiya edildiyi zaman təhlil edək. Birbaşa geliştirici konsolunuzda yoxlaya bilərsiniz.

2019

Hər hansı bir yyy undefined və ya null, bu doğru qaytarır

 if (typeof yyy == 'undefined' || !yyy) { console.log('yes'); } else { console.log('no'); } 

evet

 if (!(typeof yyy == 'undefined' || !yyy)) { console.log('yes'); } else { console.log('no'); } 
yox

yox

2
19 окт. Cavab Terry Lin tərəfindən 19 oktyabrda verilir . 2017-10-19 11:31 '17 'də saat 11:31 ' də 2017-10-19 11:31

Hər iki dəyər asanlıqla müqayisə edilən operator vasitəsilə asanlıqla fərqlənə bilər:

İş nümunəsi:

http://www.thesstech.com/tryme?filename=nullandundefined

Kod nümunəsi:

 function compare(){ var a = null; //variable assigned null value var b; // undefined if (a === b){ document.write("a and b have same datatype."); } else{ document.write("a and b have different datatype."); } } 
0
24 июня '15 в 0:31 2015-06-24 00:31 Cavab, Sohail Arif tərəfindən 24 İyun 2015 günü 0:31 2015-06-24 00:31 tarixində verilir

burada Array () metodunu istifadə edərək başqa bir yol:

 [undefined, null].includes(value) 
0
29 янв. Jason Jan 29'a cavab verin 2019-01-29 05:10 '19 'da 5:10 ' də 2019-01-29 05:10 'də

Məqsədsizliyin testi ( if (value == null) ) və ya qeyri-nullity ( if (value != null) ) dəyişən tərifin vəziyyətini yoxlamaqdan daha az olsa.

Əlavə olaraq, if (value) (və if( obj.property) ) dəyişən (və ya obyekt mülkiyyətinin) false bir boolean dəyəri ilə müəyyən edildikdə işləməyəcəyini təmin if( obj.property) . Caveat emptor :)

0
25 июня '14 в 12:03 2014-06-25 12:03 Cavab lucsorel tərəfindən 25 iyun 'da 14:03 ' də verilir 2014-06-25 12:03

Bu formanın funksiyasını təyin etməlisiniz:

 validate = function(some_variable){ return(typeof(some_variable) != 'undefined'  some_variable != null) } 
-1
17 янв. Cavab ljofre 17 yanvar verilir . 2014-01-17 21:12 '14 at 21:12 2014-01-17 21:12

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