JavaScript və ya dəyişən təyinatı (||)

Bu javascript parçasını nəzərə alaraq ...

 var a; var b = null; var c = undefined; var d = 4; var e = 'five'; var f = a || b || c || d || e; alert(f); // 4 

Kimsə mənə bu texnikanı nə adlandırdığını izah edə bilərmi (ən yaxşı tahminim bu sualın başlığında!)? Və necə / niyə bu dəqiq işləyir?

Mən başa düşürəm ki, ilk dəyişənin ən yaxın dəyərini (soldan sağa) təyin edəcəyini başa düşürəm ki, bu da null, nə də müəyyən olmayan bir dəyərə malikdir, amma bu üsulla bağlı çoxlu istinad materialları tapa bilmədim və çox istifadə etdiyini gördüm.

Həmçinin, JavaScript-nin xüsusi üsuludur? PHP-də bu kimi bir şeyin ediləcəyini f özü deyil, gerçək boolean dəyərinə səbəb olacağını bilirəm.

287
20 янв. chat tərəfindən qurulan Jan 20 2010-01-20 13:53 '10 at 13:53 2010-01-20 13:53
@ 13 cavab

Bir şərh üçün, qısa qapanma bax. Bu, bu operatorları həyata keçirmək üçün ümumi bir yoldur; javascript üçün unikal deyil.

183
20 янв. Cavab 20 Yanvar çəkilməklə verilir 2010-01-20 13:54 '10 at 13:54 2010-01-20 13:54

Bu, varsayılan bir değer atamak üçün yapılır, bu halda y değişkeni x yalan ise y değeri.

JavaScript-dəki məntiqi operatorlar başqa bir dildə olduğu kimi, həm də bir məntiqi nəticəni deyil, bir operandan dönə bilərlər.

Mantıksız OR ( || ) operatoru ilk işlənmənin dəyərini qaytarır, əks halda ilk operandın dəyəri qaytarılır.

border=0

Məsələn:

 "foo" || "bar"; // returns "foo" false || "bar"; // returns "bar" 

Falsi dəyərləri boolean kontekstində istifadə edildikdə false olanlardır və onlar 0 , null , undefined , boş string, NaN və əlbəttə false .

155
21 июня '10 в 23:11 2010-06-21 23:11 Cavab CMS tərəfindən 21 İyun, '10 'da 23:11' də verildi. 2010-06-21 23:11

Javacript mantıksal operatorlar üçün qısa dövrə qiymətləndirməsini istifadə edir və > . Buna baxmayaraq, digər dillərdən fərqlənir ki, true və ya false dəyərlər yerinə icra dayandırılan son qiymətin nəticəsini qaytarır.

Aşağıdakı dəyərlər javascriptdə yalan hesab olunur.

  • yanlış
  • sıfır
  • "" (boş simli)
  • 0
  • nənə
  • müəyyən edilmədi

Operatorun prioritet qaydalarına diqqət yetirmək və sadə məsələləri saxlamaq üçün aşağıdakı nümunələr qiymətləndirmənin dayandırıldığını göstərir və nəticədə nəticəsi var.

 false || null || "" || 0 || NaN || "Hello" || undefined // "Hello" 

NaN dəki ilk 5 dəyərlər NaN , buna görə hamısı soldan sağa, ilk gerçək dəyərinə - "Hello" yerinə yetirilir, buna görə də bütün ifadə doğru olur, buna görə heç bir şey qiymətləndirilmir və "Hello" ifadəsi nəticəsində geri qaytarılır. Eynilə, bu vəziyyətdə:

 1  []  {}  true  "World"  null  2010 // null 

İlk 5 dəyərlər doğrudur və onlar ilk yalan dəyərini ( null ) yerinə yetirənə qədər qiymətləndirilir, bu da yalan ifadəsini yaradır, buna görə də 2010 qiymətləndirilmir və ifadə nəticəsində null qaytarılır.

Yuxarıdakı misalda, bu JavaScript funksiyası vəzifəni yerinə yetirmək üçün istifadə olunur. Bir dəyər dəyərləri arasında həqiqət və ya saxtakarlığın ilk dəyərini almaq üçün lazım olan yerlərdə istifadə edilə bilər. Aşağıdakı bu kod, "Hello" ifa-else" testini yerinə yetirmək əvəzinə, u mənim dəyərin tapşırığını asanlaşdırdığından "Hello" b dəyərini təyin edir.

 var a = false; var b = a || "Hello"; 

Bu funksiyanı istifad etmək üçün aşağıdakı nümunəyə zəng edə bilərsiniz və bu kodun oxumasını daha çətinləşdirdiyinə inanıram.

 var messages = 0; var newMessagesText = "You have " + messages + " messages."; var noNewMessagesText = "Sorry, you have no new messages."; alert((messages  newMessagesText) || noNewMessagesText); 

Xəbərdarlıq içərisində, messages səhv olub olmadığını yoxlayırıq və əgər varsa, qiymətləndirmək və noNewMessagesText qayıtmaq, əks halda qiymətləndirmək və newMessagesText qayıtmaq. Bu nümunədə bu yalan olduğundan, biz NoNewMessagesText-də dayanırıq və "Sorry, you have no new messages." xəbərdar "Sorry, you have no new messages." ,

116
22 июня '10 в 0:02 2010-06-22 00:02 Cavab Anurag tərəfindən 22 İyun '10 'da 0:02 2010-06-22 00:02' də verilir

Javascript dəyişənləri basılmır, belə ki f mantıksal operatorlar tərəfindən təyin edilmiş olsa da bir tamsayı dəyəri təyin edilə bilər.

f yalana bərabər olmayan ən yaxın dəyər təyin olunur. Beləliklə, 0, saxta, null, undefined, bütün keçdi:

 alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4' 
43
20 янв. Cavab 20 yanvarda Alsciende tərəfindən verildi 2010-01-20 13:58 '10 at 13:58 2010-01-20 13:58

Heç bir sehr yoxdur. a || b || c || d kimi Boolean ifadələri a || b || c || d a || b || c || d , tənbəlliklə qiymətləndirdi. İnterpeter ardıcıl dəyərini araşdıran, bu qeyri-müəyyəndir, buna görə də səhvdir, buna görə hərəkət edir, sonra da b nöqtəsini görür, yəqin ki, yanlış nəticə verir, buna görə hərəkət edir və sonra c - eyni hekayəni görür. Nəhayət, o, görür və deyir: "Bəli, bu boş deyil, nəticədə mənim nəticəim var" və o, son dəyişənə verir.

Bu oyun, Boolean qısa dövrələrinin tənbəl qiymətləndirməsini yerinə yetirən bütün dinamik dillərdə işləyəcək. Statik dillərdə, bu tərtib edilməyəcək (tip səhv). Boole ifadələrini qiymətləndirmək istəyən dillərdə, bir boolean dəyəri qaytarır (yəni, bu vəziyyətdə True).

30
20 янв. cavab Marcin 20 yanvar verilir . 2010-01-20 13:58 '10 at 13:58 2010-01-20 13:58

Bu sual artıq bir neçə yaxşı cavab aldı.

Beləliklə, bu üsul dilin necə tərtib edildiyindən istifadə edir. Yəni bir "qısa dövrəli" JavaScript, Boolean operatorlarını qiymətləndirir və ya qeyri-yalan dəyişən ilk dəyəri ilə və ya son dəyişən ilə əlaqəli bir dəyəri qaytarır. Qiymətlərin yanlış qiymətləndirildiyi bir şərh üçün Anurag'a baxın.

Bu metodu istifadə etmək bir neçə səbəbdən yaxşı bir təcrübə deyil; lakin.

  • Kodun oxunması: bu, boolean operatorların istifadəsidir və bu kompilyasiyaların necə başa düşülməməsi ilə bağlı davranışlar gözlənilən nəticə bir boolean dəyərdir.
  • Stabillik: bir neçə dil ilə uyğun olmayan bir dilin tərtibi funksiyasından istifadə edir və bununla əlaqədar gələcəkdə dəyişikliklərə potensial olaraq yönəldilə bilər.
  • Documented funksiyaları: bu ehtiyaclara cavab verən və digər dillərlə uyğun mövcud alternativ var. Bu üçtərəfli operator ola bilər:

    () dəyər 1: dəyər 2.

Üçqat operatoru istifadə edərək bir az daha yazaraq tələb edir, ancaq hesablanmış Boole ifadəsi ilə təyin olunan dəyər arasında aydın şəkildə fərqlənir. Bundan əlavə, kodlaşdırıla bilər, buna görə də yuxarıda göstərilən yerinə yetirilən əvəzetmə növləri yenidən işlənə bilər.

 var a; var b = null; var c = undefined; var d = 4; var e = 'five'; var f = ( a ) ? a : ( b ) ? b : ( c ) ? c : ( d ) ? d : e; alert(f); // 4 
9
03 июня '16 в 17:19 2016-06-03 17:19 cavab WSimpson'a 03 iyun '17' də 17:19 2016-06-03 17:19 'da verilir

Dönüş dəyəri ilk real dəyərdir .

Bütün yanlış dəyərlər son saxta dəyəri qaytarır.

Məsələn: -

  null || undefined || false || 0 || 'apple' // Return apple 
5
15 марта '16 в 15:20 2016-03-15 15:20 cavab 15 mart 16: 15-də Arşid KV tərəfindən verilir. 2016-03-15 15:20

"True" (qeyri-sıfır, real obyekt / array / funksiya / nə olursa olsun) və ya əks halda x dəyəri kimi yeni bir dəyişən ( z ) edir. Bu halda x mövcud olmadığı halda default dəyər təmin etmək nisbətən ümumi bir yoldur.

Məsələn, isteğe bağlı geri çağırma parametresini qəbul edən bir funksiyanız varsa, heç bir şey etməyən bir geri çağırışı təmin edə bilərsiniz:

 function doSomething(data, callback) { callback = callback || function() {}; // do stuff with data callback(); // callback will always exist } 
4
21 июня '10 в 23:13 2010-06-21 23:13 Cavab Matthew Crumley tərəfindən 21 İyun '10 'da 23:13' də verildi. 2010-06-21 23:13

Qısa dövr operatoru.

Qısa bir dövr təsbiti, ikinci arqumentin ifadənin dəyərini təyin etmək üçün yalnız ilk arqumentin kifayət etmədiyi halda icra və ya qiymətləndirildiyini bildirir. OR (||) funksiyasının ilk arqumenti doğru olduğunda, ümumi dəyər həqiqət olmalıdır.

Bir funksiya arqumentinin u mənim dəyərini təyin etmək üçün də istifadə edilə bilər.

 function theSameOldFoo(name){ name = name || 'Bar' ; console.log("My best friend name is " + name); } theSameOldFoo(); // My best friend name is Bar theSameOldFoo('Bhaskar'); // My best friend name is Bhaskar` 
1
22 дек. Cavab Vijay 22 dekabr verilir. 2017-12-22 14:17 '17 at 2:17 pm 2017-12-22 14:17

Bu, x təyin edildikdə z üçün dəyər x olacaq, əks halda, əgər y müəyyənləşsə, dəyəri z nin dəyəri olaraq təyin olunacaq.

bu da eynidır

 if(x) z = x; else z = y; 

Bu mümkündür, çünki JavaScript-dəki məntiqi operatorlar məntiqi dəyərləri qaytarmırlar və əməliyyatı başa çatdırmaq üçün lazım olan son elementin dəyəri (OR bənddə bu birinci etibarsız dəyər olacaq, AND-də sonuncu olacaq). Əməliyyat uğursuz olarsa, false qaytarılır.

1
21 июня '10 в 23:11 2010-06-21 23:11 cavab 21 iyun 'da saat 11:11' də Andris tərəfindən verilmişdir 2010-06-21 23:11

X qiymətləndirir və əgər X boş deyilsə, boş bir simli və ya 0 (məntiqi yanlış), onda z təyin edəcək. X sıfırsa, boş bir simli və ya 0 (məntiqi səhv), onda y və z təyin ediləcək.

 var x = ''; var y = 'bob'; var z = x || y; alert(z); 

'Bob' görüntüləyir;

0
21 июня '10 в 23:13 2010-06-21 23:13 Cavab tvanfosson tərəfindən verilir 21 İyun 2010 23:13 2010-06-21 23:13

Big Higgins blog yazısına görə; məntiqi məntiq məntiqli YA Varsa Javascript (fevral 2007), bu davranış v1.2 ilə (ən azı)

O, həmçinin onun üçün başqa bir istifadə etməyi təklif edir: " brauzerlər arasındakı fərqlərin normallaşdırılmasını asanlaşdırdı "

 // determine upon which element a Javascript event (e) occurred var target =  e.target ||  e.srcElement; 
0
21 дек. Alon Brontman tərəfindən verilmiş cavab 21 dekabr 2012-12-21 21:14 '12 at 9:14 PM 2012-12-21 21:14

JS-də bu linkə qısa qapanma qiymətləndirməsini tapdım, bu məsələ ilə çox yaxşı uyğunlaşır. Mən bu sualın uzun müddət əvvəl nəşr olunduğunu bilirəm.

0
11 янв. Cavab 11 yanvarda Angel tərəfindən verilir . 2018-01-11 20:27 '18 saat 20:27 'da 2018-01-11 20:27