Bunun çok eski bir soru olduğunu biliyorum, ancak hepsi eksik göründüğü için cevapların hiçbirinden% 100 memnun değilim. İşte yine ilk müdürlerden başlıyoruz:
Kullanıcının genel amacı:
Kodu özetlemek: " Dizede zaten sınıf adları varsa isteğe bağlı olarak baştaki bir boşlukla birlikte bir dizeye bir error
sınıf adı eklemek istiyorum ."
En basit çözüm
Kobi'nin 5 yıl önce belirttiği gibi, sınıf adlarında lider bir alana sahip olmak, bilinen tarayıcılarda herhangi bir soruna neden olmayacağından, en kısa doğru çözüm aslında şu olacaktır:
h.className += ' error';
Yani olmalıydı gerçek cevabı için gerçek bir sorun .
Olursa olsun, sorulan sorular ...
1) Bu neden işe yaradı?
h.className += h.className ? ' error' : 'error'
Koşullu / üçlü operatör, kendi true
veya false
yollarının sonucunu bir değişkene atayan bir if ifadesi gibi çalışır .
Böylece bu kod işe yaradı çünkü basitçe şu şekilde değerlendirildi:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) ve bu neden kırıldı?
h.className = h.className + h.className ? ' error' : 'error'
Soru, "konsolumda [n] hatası veren" olduğunu belirtir ve bu sizi yanlış bir şekilde kodun çalışmadığını düşünmeye sevk edebilir . Aslında şu kod olmadan çalışıyor mu hata , ama sadece döndürüyor 'hatası' dizesi eğer değildi boşaltmak ve 'hatası' dizesi eğer idi boş ve böylece gereksinimlerini karşılamak vermedi .
Bu kod her zaman yalnızca içeren bir dizeyle sonuçlanır ' error'
veya 'error'
bu sözde kodu değerlendirdiği için:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
Bunun nedeni, toplama operatörünün ( +
ortak halka) koşullu / üçlü operatörden (15) daha yüksek "önceliğe" (6) sahip olmasıdır. Numaraların geriye doğru göründüğünü biliyorum
Öncelik, basitçe, bir dildeki her bir operatör türünün belirli bir önceden tanımlanmış sırayla (sadece soldan sağa değil) değerlendirildiği anlamına gelir.
Değerlendirme sırası nasıl değiştirilir:
Şimdi neden başarısız olduğunu biliyoruz, nasıl çalıştıracağınızı bilmeniz gerekiyor.
Diğer bazı yanıtlar , önceliği değiştirmekten bahsediyor , ancak yapamazsınız . Öncelik, dile sabitlenmiştir. Bu sadece sabit bir kurallar dizisidir ... Bununla birlikte, değerlendirme sırasını değiştirebilirsiniz ...
Araç kutumuzdaki değerlendirme sırasını değiştirebilen araç , gruplama operatörüdür (parantez olarak da bilinir). Bunu, parantez içindeki ifadelerin parantez dışındaki işlemlerden önce değerlendirilmesini sağlayarak yapar . Tüm yaptıkları bu, ama bu kadar yeter.
Parantezler basitçe çalışırlar çünkü onlar (gruplama operatörleri) diğer tüm operatörlerden daha yüksek önceliğe sahiptir ("artık bir seviye 0 vardır").
Basitçe parantez ekleyerek , basit dize birleştirmeden önce koşullu testin gerçekleştirildiğinden emin olmak için değerlendirme sırasını değiştirirsiniz :
h.className = h.className + (h.className ? ' error' : 'error')
Şimdi bu cevabı diğerleri arasında görünmeden paslanmaya bırakacağım :)
h.className += ' error'
, eğer başlangıçta boşsa dizenin başında da bir boşluk bırakıyor. Üçlü işlemin amacının temiz görünümlü bir ip üretmek olduğuna inanıyorum.