Javascript kısaltma üçlü operatörü


104

Bu fazlalık üçlü operatör sözdizimini kullanmak yerine php 5.3'te şunu biliyorum:

startingNum = startingNum ? startingNum : 1

... üç terimli işleçlerimiz için uygun olduğu yerlerde kısa bir sözdizimi kullanabiliriz:

startingNum = startingNum ?: 1

Ve javascript'teki üçlü operatörü biliyorum:

startingNum = startingNum ? startingNum : 1

... ama bir steno var mı?

Yanıtlar:


179
var startingNumber = startingNumber || 1;

Bunun gibi bir şey aradığınız şey, tanımsızsa varsayılan nerede?

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2

Bu arada, bu, nesneler dahil birçok senaryo için işe yarar:

var foo = bar || {}; // secure an object is assigned when bar is absent

Gerçekten, bu sabah sıçradı. Düzeltildi, ama fark ettiğin için teşekkürler.
Brad Christie

1
Onun ||yerine mi demek istiyorsun ???
Rocket Hazmat

2
Teşekkürler! Başardın. Aslında bu örnekte bir nesne kullanıyorum. :)
Web_Designer

8
Merak eden herkes için bu işe ||yarar çünkü JS'nin operatörü doğru veya yanlışı döndürmez, ilk 'doğru' değeri döndürür. Sahip Say val0ve val1olduğu gibi undefinedve val2olduğu 2, val3olduğu 3. ilk 'doğru' değer olduğu için val0 || val1 || val2 || val3dönecektir 2.
Jake T.

2
Bu deyim bir kalıp karşıtı değil mi? 0 veya boş dize geçirirseniz, 'VEYA' ifadesi onu atlar ve gerçekte 0 istediğiniz yerde varsayılan değeri veya boş dizeyi kullanır.
Paul Trzyna

24

|| karşılaştığı ilk doğru değeri döndürür ve bu nedenle C # 'lara benzer şekilde birleştirme operatörü olarak kullanılabilir ??

startingNum = startingNum || 1;

Açıklamanızı diğerlerinden daha çok
beğeniyorum

12

Evet var:

var startingNum = startingNum || 1;

Genel olarak, expr1 || expr2aşağıdaki şekilde çalışır ( belgelerde belirtildiği gibi ):

expr1Dönüştürülebiliyorsa döndürür true; aksi takdirde döner expr2. Bu nedenle, birlikte kullanıldığında Booleandeğerleri, ||döner trueya da işlenen ise true; eğer ikisi de öyleyse false, döner false.


Şöyle demek daha doğru değil mi if a is truthyvs if a is evaluated to true?
JaredPar

3
@JaredPar: Belirsizliği önlemek için, orijinal ayrıntılı açıklamamı Mozilla Developer Network'ten olanla değiştirdim. Daha az belirsiz olmalı.
Tadeck

2
var startingNum = startingNum || 1;

Bu durumda, OR operatörünü kullanabilirsiniz.


2
startingNum = startingNum || 1

Null ile bir koşulunuz varsa,

startingNum = startingNum ? startingNum : null

kullanabilirsiniz '&&'

startingNum = startingNum && startingNum

Ama yanlış olmadığı anything && nullsürece null olarak değerlendirilmeyecek anythingmi?
Petruza

Evet, herhangi bir şey doğruysa, boş olarak değerlendirilir. Yanlışsa, yanlış değer olarak değerlendirilir
a2441918

1

Yukarıdaki cevaplar doğrudur. JavaScript'te aşağıdaki ifade:

startingNum = startingNum ? otherNum : 1

olarak ifade edilebilir

startingNum = otherNum || 1

Burada ele alınmayan başka bir senaryo, değerin eşleşmediğinde yanlış döndürmesini istemenizdir. Bunun JavaScript kısaltması:

startingNum = startingNum ? otherNum : 0

Ancak şu şekilde ifade edilebilir

startingNum = startingNum && otherNum

Başkalarının daha genel bir cevap araması durumunda başka bir senaryoyu ele almak istedim.


bunun gibi bir şeyin kısaltması var mı: x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
yaşlı çocuk

@Anthony Hayır, çünkü innerWidth * 0.0375 > 24olan if truekısımdan farklıdır innerWidth * 0.0375. Eğer steno yalnızca kullanılabilir expression to be evaluatedve if trueaynı değerdir. Neden stenografi yapamayacağınla aynı x = someBoolean ? 'Heck yea!' : 'No way!'.
deedub

@deedub pekala, aslında, bir "stenografi" var (eğer onu çağırırsan) buMath.max(innerWidth * 0.0375, 24)
ihtiyar

@Anthony Buna böyle demezsiniz;) Ancak Math.maxkullanım durumunuzda üçlü bir operatörden daha iyi çalışır.
deedub

1
" startingNum = startingNum ? otherNum : 1olarak ifade edilebilir startingNum = otherNum || 1" yanlıştır. bunu daha yeni test ettim
yaşlı çocuk

0

Üçlü sayı yapmak için:

boolean_condition ? true_result : false_result

javascript'te şunları yapabilirsiniz:

(boolean_condition && true_result ) || false_result;

Misal:

(true && 'green') || 'red';
=> "green"
(false && 'green') || 'red';
=> "red"

sooo x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24olur mu (innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24? innerWidth * 0.0375Bir değişkene atamak dışında tekrar etmem için bir steno var mı ???
yaşlı çocuk

1
Bu durumda Math.max( innerWidth * 0.0375 , 24 )zarif bir şekilde çalışırdı. Daha genel bir durum için, bir değişken oluşturmaktan ziyade okunabilirliği artıran 'bir şeylerleştirilmiş İç Genişlik' adı verilen açıklayıcı bir yöntem oluşturmak daha iyi olacaktır. Bazı durumlarda (bu tanımlayıcı isme ait) bir değişkene sahip olmak daha okunaklı olsa da, bu nedenle gelecekte 'neden bununla çarpılıyor?' yükseltilmedi.
xxjjnn

wow için 2. bir argüman sağlayabileceğinizi bile bilmiyordum Math.max. süper zarif çözüm !!
yaşlı çocuk
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.