Javascript Üçlü Operatörü vs. ||


17

Daha önce bazı node.js koduna bakıyordum ve bunu yazan adamın aşağıdaki sözdizimini desteklediğini fark ettim:

var fn = function (param) {
    var paramWithDefault = null == param ? 'Default Value' : param;
}

Ben daha özlü olarak düşündüğüm üzerinde:

var fn = function (param) {
    var paramWithDefault = param || 'Default Value';
}

İkinci formun aslında sosyal olarak daha kabul edilebilir bir JavaScript sözdizimi olup olmadığını merak ediyordum, bu amaçla üçlü operatörden daha çok vahşi bir şekilde gördüm.

İlk örnekte, çift eşittir (üçlü eşit değil) kullandığını, yani "tanımsız" değeri null olarak sayacağı anlamına gelir ve bu da düşünebileceğim bir etkiyi azaltır. Ancak, == JavaScript'te oldukça kötü bir operatör olduğunu birçok yerde okudum (JSLint buna karşı çok fazla, IIRC).


2
Yorum yapanlar : yorumlar uzun tartışmalar için değil, açıklama arayışı içindir. Bir çözümünüz varsa, bir cevap bırakın. Çözümünüz zaten yayınlanmışsa, lütfen oy verin. Bu soruyu başkalarıyla tartışmak isterseniz, lütfen sohbeti kullanın . Daha fazla bilgi için SSS bölümüne bakın .

Yanıtlar:


17

Çünkü 0, "", false veya başka bir falsy değerini her ilettiğinizde bu kod "Varsayılan Değer" olarak değerlendirilir.

function fn(param) {
  var paramWithDefault = param || 'Default Value';
  return paramWithDefault;
}

Bu özel işlevi nasıl kullandığınız konusunda sizi ısırmayabilir, ancak boş dizeler veya 0 veya bir boole gibi şeyleri iletmeyi önemsediğinizde kaçınmak kötü bir modeldir.


bir nesnede yalnızca boş bir birleşim kullanmalısınız ve bir nesne tanımlanmışsa, bu çalışmaz. Belki boş dize hariç.
Malfist

4
Sıfır karşılaştırması iyi bir nokta, bu beklenmedik olabilir.
Ed James

1
+1 - bu sorun tam olarak neden Python'un (sonunda) "x y y ise z" sözdizimini eklediğidir. Mantıksal işleçler için bu semantik oldukça yaygındır ve aynı yaygın hatalar, deyimler koşullu seçim operatörlerinin işini yapmak için onlara güvendiğinde ortaya çıkma eğilimindedir.
Steve314

sadece yapılarınızı parantez içine almayı unutmayın, eğer dize birleştirme ile birlikte kullanırsanız var txt = 'Hello, ' + (user_name||'User') + '!';çalışır, ancak parantez olmadan - alırsınız undefined. jsfiddle.net/4mFAB/1
c69 10:11

7

Gerçekten ihtiyacınız olan boş bir birleştirme operatörü. Ancak javascript'in gerçekten bir tane olmadığını görünce, programcılar genellikle '||' bunun için durmak.

Ancak, her ikisi de mükemmel makul. Boş bir birleşim operatörünün ne olduğunu anlamayanlar için üçlü üçlü operatörün anlaşılması daha olasıdır.


İlgili diğer bir operatör Icon operatörü IIRC "else" yazımdır. Bu, birinci bağımsız değişkenin özel bir "başarısız" sonucunu tanır ve bu durumda ikinci bağımsız değişkeni alternatif olarak kullanır. Ben Pythons "x y y z" iki ayrı işleçler kullanılarak uygulanmasını isterdim - bir "if" ikili iddiası operatörü ve bir Simge benzeri "else" operatörü - bu iki operatör bağımsız olarak kullanılabilir. Ancak, Icon bu stili desteklemedi, bunun yerine göreceli işleçlerle tuhaf bir şey yaptı.
Steve314

@ Steve314: Python'da istediğiniz bir şey var: ayrı bir operatör [false-part, true-part]ile [..][bool(condition)]birleştirilirse ayrı bir operatör [false-part, true-part][bool(condition)]. Tembel davranış istiyorsanız, doğru ve yanlış kısmı lambdalayabilirsiniz.
Yalan Ryan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.