JavaScript'te "Başka" Olmadan Üçlü Operatörler


149

Her zaman nullbaşka hiçbir şeye sahip olmayan koşulları koymak zorunda kaldım . Etrafında yine de var mı? Örneğin

condition ? x = true : null;

temel olarak, yapmanın bir yolu var mı:

condition ? x = true;

Şimdi bir sözdizimi hatası olarak görünüyor

Bilginize, işte gerçek bir örnek kod:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;

21
Üçlü gibi bir kullanım condition ? x = true : null;muhtemelen yazılmalıdır x = (condition ? true : null);. Bir yana, javascript nullyanlış olarak değerlendirir, böylece bu durumda x = (condition);ve aynı sonucu elde edebilirsiniz .
Matt S

1
matt, cevabınız en iyisi, ama bu bir cevap değil, bir yorum!
Cheeso

Matt, ACTUAL kodum:! Defaults.slideshowWidth? defaults.slideshowWidth = obj.find ('img'). width () + 'px': boş; bunu yazmanın daha kısa ve iyi bir yolu var mı?
Oscar Godson

2
defaults.slideshowWidth = defaults.slideshowWidth || obj.find ('img'). genişlik () + 'px';
kennebec

kimlik atamasından kaçınmak daha iyi olurdu, bu yüzden bu sadece bir koşul olmalı:if (!defaults.slideshowWidth) defaults.slideshowWidth = obj.find('img').width()+'px'
Mihail Malostanidis

Yanıtlar:


226

Her şeyden önce, üçlü bir ifade if / else yapısının yerini tutmaz - bir değer döndüren if / else yapısına eşdeğerdir . Yani, bir if / else deyimi kod, üçlü bir ifade bir ifadedir , yani bir değer döndürür.

Bu birkaç anlama geliyor:

  • üçlü ifadeleri yalnızca =dönüş değerinin atanacağı değişkenin sol tarafında bir değişkeniniz olduğunda kullanın
  • üçlü ifadeleri yalnızca döndürülen değer iki değerden biri olduğunda kullanın (veya uygunsa iç içe ifadeleri kullanın)
  • ifadenin her bölümü (? ve sonrası:) yan etkileri olmayan bir değer döndürmelidir ( x = truetüm ifadeler son değeri döndürdüğü için ifade true değerini döndürür, ancak x döndürülen değer üzerinde herhangi bir etkiye sahip olmadan x değerini değiştirir)

Kısacası - üçlü ifadenin 'doğru' kullanımı

var resultofexpression = conditionasboolean ? truepart: falsepart;

condition ? x=true : null ;Değerini ayarlamak için üçlü bir ifade kullandığınız örnek yerine, şunu xkullanabilirsiniz:

 condition && (x = true);

Bu hala bir ifadedir ve bu nedenle doğrulamayı geçmeyebilir, bu nedenle daha iyi bir yaklaşım

 void(condition && x = true);

Sonuncusu doğrulama işlemini geçecek.

Ama sonra tekrar, eğer beklenen değer bir boole ise, sadece koşul ifadesinin sonucunu kullanın

var x = (condition); // var x = (foo == "bar");

GÜNCELLEME Numunenizle ilgili olarak bu muhtemelen daha uygundur:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

4
parlak SO, düzenleme i/elseyeterli karakter olmadığı için yazım hatası düzeltmek için izin vermiyor.
dewd

1
void (condition && x = true) - bu harika görünüyor, ancak "geçersiz atama sol tarafı" hatası
veriyor

1
void (condition && (x = true)) // atamayı ilk değerden ayrı tutar
diamondsea

4
Ancak, bu özellikle bu stile alışkın olmayan geliştiriciler için okumak sezgisel değildir. Bunu daha kolay ve daha okunaklı bir şekilde şöyle yazabilirsiniz: if (condition) {x = true; }
diamondsea

2
"Doğrulamayı geçemeyebilir" derken ne demek istediğinizi açıklayabilir misiniz? İfadeyi neden sarması gerektiğini anlamıyorum void(). Teşekkürler.
gilad mayani

20

Hayır, üç işlenene ihtiyacı var. Bu yüzden üçlü operatörler denir .

Bununla birlikte, örnek olarak sahip olduklarınız için bunu yapabilirsiniz:

if(condition) x = true;

Gelecekte birden fazla ifade eklemeniz gerekiyorsa kaşlı ayraçlara sahip olmak daha güvenli olsa da:

if(condition) { x = true; }

Düzenleme: Artık sorunuzun geçerli olduğu gerçek koddan bahsettiğinize göre:

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }

1
Yapabilirsin ama yapmamalısın. En azından etrafında kıvırcık parantez olmadan değil - çok hata eğilimli.
Konerak

1
bu doğru mu? Kıvırcıklık istemenin temel nedeninin jslint'in hayatını kolaylaştırmalarıydı.
Cheeso

@Cheeso, yeniden düzenleme anlamında hataya açık. Gerçek bir durumda, kıvırcık parantez olmadığını fark etmeden daha fazlasını eklemek için geri döneceksiniz. Yeni kod, true olduğunda değil, her zaman yürütülür.
Matt S

Hayır biliyorum, sadece eğer eşittir if () {} else {} gibi ekstralar olmadan koşullu yazma gibi?:;
Oscar Godson

3
Dürüst olmak gerekirse, geliştiricilerin Javascript'ten daha fazla bir dil kullanmaktan daha fazla korktuğunu bilmiyordum: Onları çok fazla atladım ve yanlışlıkla bir ayracı kaçırdığımdan daha fazla sorunum yok.
Andy E

12

Çoğu zaman insanlar ifade sözdizimini kısaltmak için mantıksal operatörlerden yararlanır:

!defaults.slideshowWidth &&
  (defaults.slideshowWidth = obj.find('img').width()+'px');

Ancak sizin durumunuzda sözdizimi daha da basit olabilir

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

Bu kod defaults.slideshowWidth eğer değerini defaults.slideshowWidthdoğru ve değerlendirilir obj.find('img').width()+'px'aksi değeri.

Ayrıntılar için mantıksal işleçlerin Kısa Devre Değerlendirmesine bakın.


11
var x = condition || null;

2
(defaults.slideshowWidth) || (defaults.slideshowWidth = obj.find('img').width()+'px')veyadefaults.slideshowWidth = defaults.slideshowWidth || (obj.find('img').width()+'px')
Casey Chu

> True değerine dönüştürülebilirse ifade1'i döndürür; aksi takdirde ifade2'yi döndürür. Mantıksal Operatörler (MDN)
Szabolcs Pazar

5

Yazabilirsin

x = condition ? true : x;

Böylece koşul yanlış olduğunda x değiştirilmez.

Bu daha sonra şuna eşdeğerdir:

if (condition) x = true

DÜZENLE:

!defaults.slideshowWidth 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : null 

Birkaç alternatif var - bunların daha iyi / daha kötü olduğunu söylemiyorum - sadece alternatifler

Üçüncü parametre olarak null değerini iletmek, varolan değer null olması nedeniyle çalışır. Durumu yeniden düzenler ve değiştirirseniz, bunun artık doğru olmadığı tehlikesi vardır. Üçlü korumalarda buna karşı mevcut değeri 2. seçenek olarak aktarmak:

!defaults.slideshowWidth = 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : defaults.slideshowwidth 

Daha güvenli, ancak belki de bakmak hoş değil ve daha fazla yazıyor. Uygulamada, muhtemelen yazarım

defaults.slideshowWidth = defaults.slideshowWidth 
               || obj.find('img').width()+'px'

Bazı canlı kod (null bu durumda null kurtulmak için?):! Defaults.slideshowWidth? defaults.slideshowWidth = obj.find ('img'). width () + 'px': boş;
Oscar Godson

2

Senin durumunda üçlü operatörü gereksiz görüyorum. Değişkeni ||, && operatörlerini kullanarak doğrudan ifadeye atayabilirsiniz.

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ;

Olacak :

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

Daha açık, daha çok "javascript" tarzı.


2

Peki ya basitçe

    if (condition) { code if condition = true };

1

Bir dizi veya nesne bildirimi içinde başka bir Üçlü İşleç kullanmak için ES6 forma işlecini kullanabilirsiniz ...()

const cond = false;
const arr = [
  ...(cond ? ['a'] : []),
  'b',
];
    // ['b']

Ve nesneler için:

const cond = false;
const obj = {
  ...(cond ? {a: 1} : {}),
  b: 2,
};
    // {b: 2}

orjinal kaynak

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.