Javascript Ternary Operator ilə operatorun prioriteti

Mən bu kodun birinci hissəsini (+ =) üçtərəfli operatorla birlikdə birləşdirmək kimi görünürəm.

 h.className += h.className ? ' error' : 'error' 

Hesab edirəm ki, bu kod aşağıdakı qaydada işləyir:

 h.className = h.className + h.className ? ' error' : 'error' 

Amma bu doğru deyil, çünki mənim konsoluma bir səhv verir.

Beləliklə, mənim sualım: bu kodu düzgün şəkildə necə şərh etmək olar?

115
24 нояб. Baijs 24 Noyabrda təyin olundu 2009-11-24 12:27 '09 at 12:27 'də, 2009-11-24 12:27
@ 7 cavab
 h.className = h.className + (h.className ? ' error' : 'error') 

Operatorun h.className üzərində h.className , onu daha h.className göstərin.
Əlbəttə ki, h.className += ' error' heç bir zərər olmamalıdır, amma bu başqa bir məsələdir.

Həmçinin qeyd edək ki, + üçlü operator üzərində üstünlük təşkil edir: JavaScript operatorunun prioriteti

140
24 нояб. Cavab 24 noyabrda Kobi tərəfindən verilir. 2009-11-24 12:30 '09 at 12:30 pm 2009-11-24 12:30

Bu şəkildə düşünün:

 <variable> = <expression> ? <true clause> : <false clause> 

Operatorun yerinə yetirilməsi yolu əsasən aşağıdakılardır:

border=0
  • <expression> doğru olaraq qiymətləndirir və ya yanlış qiymətləndirir?
  • <expression> doğruysa, <true clause> <variable> <true clause> <false clause> , <false clause> göz ardı edilir və aşağıdakı bəyanat yerinə yetirilir.
  • <expression> səhv varsa, <true clause> göz ardı edilir və <false clause> <variable> <false clause> olunur.

Bu və digər dillərdə üçtərəfli operatorla həyata keçirilmə üçün vacibdir ki, <expression> hər hansı bir kodu qiymətləndirərkən mantıksal bir nəticəyə gətirib çıxarmalıdır: ya doğru, ya da yalan.

Məsələn nümunə halında mənim izahatımda "əlavə edilmiş" və ya əgər varsa, istifadə etdiyiniz hər hansı bir qısaldılmış arifmetiklə "təyin edilmiş" əvəz edin.

129
24 нояб. Wayne Koorts tərəfindən verilmiş cavab 24 Noyabr. 2009-11-24 12:35 '09 at 12:35 'də 2009-11-24 12:35

+= İstədiyiniz şeyi edir, lakin sağ üçlü ifadədə h.className səhv olub-olmadığını yoxlayır, yoxsa müəyyənləşdirilmir. Bu doğruysa (məsələn, sinif adı artıq göstərilmişdirsə), səhv bir boşluqla əlavə olunur (yəni, yeni bir sinif əlavə olunur), əks halda boşluq əlavə edilir.

Kod, təklif etdiyiniz kimi yenidən yazıla bilər, ancaq h.className ehtimalları müqayisə etmək üçün istifadə etmək və üçlü operatorda onun əsl dəyərini istifadə etmək üçün istifadə etmək lazımdır. Beləliklə, üçlünün yerinə yetirilməsi ilə eyni zamanda dəyərlərin birləşməsi ilə yanaşı gəlmirsiniz əməliyyatlar:

 h.className = h.className + (h.className ? ' error' : 'error'); 
10
24 нояб. David Hedlund tərəfindən verilmiş cavab 24 noyabr 2009-11-24 12:34 '09 at 12:34 2009-11-24 12:34

Operatorun sağ tərəfi = soldan sağa qaldı. Beləliklə

 g.className = h.className + h.className ? ' error' : 'error';` 

bərabərdir

 h.className = (h.className + h.className) ? ' error' : 'error'; 

Buna bərabərdir

 h.className += h.className ? ' error' : 'error'; 

üçüncü operatoru mötərizədə ayırmaq lazımdır

 h.className = h.className + (h.className ? ' error' : 'error'); 
4
24 нояб. Cavab 24 noyabrda Justin Johnson tərəfindən verilir . 2009-11-24 12:30 '09 at 12:30 pm 2009-11-24 12:30
 if (h.className) { h.className = h.className + ' error'; } else { h.className = h.className + 'error'; } 

aşağıdakılara bərabər olmalıdır:

 h.className += h.className ? ' error' : 'error'; 
3
24 нояб. Cavab Darin Dimitrov 24 noyabrda verilir. 2009-11-24 12:34 '09 at 12:34 2009-11-24 12:34

Yolun izahatını seçmək istərdim:

 <variable> = <expression> ? <true clause> : <false clause> 

Hər iki hadisəni nəzərdən keçirək:

 case 1: h.className += h.className ? 'true' : 'false' 
  • Atama operatoru
  • gözəl işləyir və dəyər əlavə olunur
  • ilk dəfə çalışırken, o / p: yanlış
  • 2-ci dəfə. o / p: falsetrue - dəyərlər saxlanılır.

Seçim 2: h.className = h.className + h.className? 'doğru': 'yanlış'

  • nəticə 1 halda olduğu kimi eyni deyildir
  • ilk dəfə çalışırken, o / p: yanlış
  • 2-ci dəfə. o / p: saxta dəyərlər qeyd edilmir.

explanation

Case 1 yuxarıda göstərilən kodu yaxşı işləyir.

sonra case2:

 h.className = h.className + h.className ? 'true' : 'false' is executed as h.className = (h.className + h.className) ? 'true' : 'false' 

h.className + h.className = üçqat operator üçün bir ifadə kimi qəbul edilir, çünki üçqat operator daha yüksək prioritet alır. belə ki, həmişə üç ifadənin nəticəsi sadəcə təyin olunur

Siz parantez istifadə edərək prioritet olmalıdır.

Qiymətləndirmə qaydasını müəyyənləşdirməlisiniz, bu vəziyyət 2-ci hal üçün mötərizələrdən istifadə ediləcək, 1 halda işləməlidir

 h.className = h.className + (h.className ? ' error' : 'error') 
1
12 июля '11 в 10:34 2011-07-12 10:34 Cavab Angelin Nadar tərəfindən 12 İyul, '11 'də saat 10:34' da 2011-07-12 10:34 'də verilir

Bilirəm ki, bu, çox köhnə bir sualdır, amma cavabların heç biri ilə razı deyiləm, çünki hamısı tamam deyil. Beləliklə, yenidən ilk prinsiplərdən keçirik:

İstifadəçinin ümumi məqsədi:

Kodu ümumiləşdirmək üçün: "Sətirdə artıq sinif adları varsa, sinfi adı error simvol əlavə etmək istəyirəm.

Sadə həll

Kobe 5 il öncə qeyd etdiyimiz kimi, sinif adları üzrə aparıcı yer olan brauzerlər ilə əlaqəli problemlər yaranmır, belə ki, əslində ən qısa doğru həlldir:

 h.className += ' error'; 

Bu, faktiki problemin faktiki cavabından olmalıdır.


Mümkün olduğunca, soruşulan suallar ...

1) Niyə bu işləyir?

 h.className += h.className ? ' error' : 'error' 

Şərti / üçqat operator bir dəyişənin nəticəsini true və ya false dəyişən təyin edən if ifadəsi kimi işləyir.

Belə ki, bu kod sadəcə olaraq qiymətləndirilmişdir, çünki:

 if (h.className IS NOT null AND IS NOT undefined AND IS NOT '') h.className += ' error' else h.className += 'error' 

2) və bunun səbəbi nədir?

 h.className = h.className + h.className ? ' error' : 'error' 

Sualda deyilir ki, "mənim konsoluma səhv [n] verər" ki, bu kod işləməyəcəyini nəzərə alsın. Əslində, aşağıdakı kod səhvsiz işləyir, amma sadəcə string boş deyilsə və "səhv" simli boş olduqda və bu səbəbdən tələbləri yerinə yetirmədiyi halda "səhv" qaytarır.

Bu kod həmişə yalnız ' error' və ya 'error' olan bir simli çıxardır, çünki bu söz-kodunu hesablayır:

 if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '') h.className = ' error' else h.className = 'error' 

Bunun səbəbi, əlavə operator ( + adi insanlar üçün) şərti / üçqat operatordan (15) daha yüksək "prioritet" (6) var. Nömrələrin geri qaytarıldığını bilirəm.

Prioritet sadəcə deməkdir ki, bir dildə olan hər bir bəyanat müəyyən bir əvvəlcədən müəyyən edilmiş qaydada (yalnız soldan sağa) qiymətləndirilir.

Yardım: Prioritet operator Javascript

Qiymətləndirmə qaydasını dəyişmək üçün necə:

İndi biz bunun uğursuzluğunu bilirik, bunun necə işlədiyini bilmək lazımdır.

Bəzi digər cavablar prioritetləri dəyişdirməkdən danışır, amma edə bilməzsiniz. Prioritet dil ilə sıx bağlıdır. Bu yalnız müəyyən bir qaydalar dəsti ... Ancaq qiymətləndirmə qaydasını dəyişə bilərsiniz ...

Toolbarımızda qiymətləndirmə qaydasını dəyişdirə bilən bir vasitədir qruplaşdırma operatoru (aka brackets). Bu, mötərizələr xaricində əməliyyatlardan əvvəl mötərizədə ifadə ifadələrini təmin etməklə həyata keçirilir. Bütün bunlar budur, lakin bu kifayətdir.

Mötərizədə sadəcə işləyənlər (qruplaşdırma operatorları) bütün digər operatorlara nisbətən üstünlük təşkil edirlər ("indi səviyyə 0 var").

Yalnız parantez əlavə edərək, şərti testin əvvəlcə, sadə simli birləşmədən əvvəl yerinə yetirilməsi üçün qiymətləndirmə qaydasını dəyişirsiniz:

 h.className = h.className + (h.className ? ' error' : 'error') 

İndi bu cavabı başqaları arasında paslı görünməz tərk edəcəyəm :)

1
11 июня '14 в 18:29 2014-06-11 18:29 cavab 11 iyun 'da 18:29' də Gone Coding tərəfindən verilmişdir 2014-06-11 18:29