Üçlü bir operatör (aka if) ifadesi kendinizi tekrar etmeden nasıl yazılır


104

Örneğin, bunun gibi bir şey:

var value = someArray.indexOf(3) !== -1 ? someArray.indexOf(3) : 0

Bunu yazmanın daha iyi bir yolu var mı? Yine, yukarıdaki soruya tam olarak bir yanıt aramıyorum, sadece üç terimli operatör ifadelerinde tekrarlanan operandlara sahip olabileceğinize bir örnek ...


2
So an ifand not anif/else
zer00ne

53
just an example of when you might have repeated things in the ternaryhesaplanan ifadeleri tekrar etmeyin. Değişkenler bunun içindir.
vol7ron

4
Bunu nasıl belirliyorsunuz 3endeksine değil 0ait someArray?
konuk271314

3
Buradaki amacınız nedir? Satır uzunluğunu azaltmaya mı çalışıyorsunuz, yoksa özellikle üçlü bir değişkenin tekrarından kaçınmaya mı çalışıyorsunuz? İlki mümkün, ikincisi değil (en azından üçlüler kullanmıyor).
asgallant

5
Neden Math.max(someArray.indexOf(3), 0)bunun yerine kullanmıyorsunuz ?
301_Moved_Permanently

Yanıtlar:


176

Şahsen ben bunu yapmanın en iyi yolunu hala eski güzel söz buluyorum if:

var value = someArray.indexOf(3);
if (value === -1) {
  value = 0;
}

32
Açık olmak gerekirse, bu cevap bir değişkenin ifüçlü yerine bir ifadenin kullanılmasını değil, bir ara sonucu saklamak için kullanılmasını savunur . Üçlü ifadeler, bir ifadenin parçası olarak bir seçimi gerçekleştirmek için hala sıklıkla yararlıdır.
Triptych

4
@Triptych: Tekrar bak. Hiç ara değişken kullanmaz. Bunun yerine sonucu doğrudan son değişkene atar ve ardından koşul karşılanırsa üzerine yazar.
slebetman

14
Yanlış. valueİlk satırdan sonra saklanan değer orta değerdedir . Daha sonra bir sonraki satırda sabitlenen ve dolayısıyla bir ara değer olan doğru değeri içermez. Sadece ififade valuedoğru değeri içerdiği sonucuna vardıktan sonra olur . OP'deki üçlü, bunun daha iyi bir çözümdür çünkü hiçbir zaman ara bir duruma girmez.
Jack Aidley

44
@JackAidley: "OP'deki üçlü daha iyi bir çözüm çünkü hiçbir zaman ara bir duruma girmiyor." - Katılmam gerekecek. Bu, OP'nin kodundan çok daha okunabilir ve tamamen deyimsel. Ayrıca OP'nin mantığındaki bir hatayı benim için biraz daha açık hale getiriyor (Yani, indexOf () sıfır döndürürse ne olur? "Gerçek" sıfırı "bulunamadı" sıfırı "bulunamadı" sıfırı nasıl ayırt edersiniz?).
Kevin

2
bu benim yapacağım şeye yakın, tek fark valueburada teknik olarak mutasyona uğramış, bundan kaçınmaya çalışıyorum.
Dave Cousineau

102

Kod okunabilir olmalıdır, bu nedenle kısa ve öz olmak, maliyeti ne olursa olsun kısa olmak anlamına gelmemelidir - bunun için https://codegolf.stackexchange.com/ adresinde yeniden yayınlamalısınız - bunun yerine, indexokunabilirliği en üst düzeye çıkarmak için adlı ikinci bir yerel değişken kullanmanızı öneririm ( minimum çalışma süresi maliyetiyle de not ediyorum):

var index = someArray.indexOf( 3 );
var value = index == -1 ? 0 : index;

Ancak bu ifadeyi gerçekten azaltmak istiyorsanız, çünkü iş arkadaşlarınız veya proje ortaklarınız için acımasız bir sadistsiniz, o zaman işte kullanabileceğiniz 4 yaklaşım:

1: a'daki geçici değişken var ifadede

Sen kullanabilirsiniz varikinci geçici değişken tanımlamak (ve atama) için ifadenin yeteneğini indexvirgülle ayrılmış:

var index = someArray.indexOf(3), value = index !== -1 ? index: 0;

2: Kendi kendine çalışan anonim işlev

Diğer bir seçenek, kendi kendine çalışan anonim bir işlevdir:

// Traditional syntax:
var value = function( x ) { return x !== -1 ? x : 0 }( someArray.indexOf(3) );

// ES6 syntax:
var value = ( x => x !== -1 ? x : 0 )( someArray.indexOf(3) );

3: Virgül operatörü

Ayrıca JavaScript'in desteklediği, C ve C ++ 'da da bulunan kötü şöhretli "virgül operatörü" vardır.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

Tek bir ifade gerektiren bir konuma birden çok ifade eklemek istediğinizde virgül operatörünü kullanabilirsiniz.

Bunu, bu durumda yeniden atayarak yan etkilere yol açmak için kullanabilirsiniz value:

var value = ( value = someArray.indexOf(3), value !== -1 ? value : 0 );

Bu işe yarar çünkü var valueönce (bir ifade olduğu gibi), ardından en soldaki, en içteki valueatama ve sonra virgül operatörünün sağ eli ve ardından üç terimli operatör - tümü yasal JavaScript olarak yorumlanır.

4: Bir alt ifadede yeniden atama

Yorumcu @IllusiveBrian, atama valueparantezli bir alt ifade olarak kullanılıyorsa , virgül operatörünün (önceki örnekte) kullanılmasının gereksiz olduğuna dikkat çekti :

var value = ( ( value = someArray.indexOf(3) ) !== -1 ? value : 0 );

Not mantıksal ifadelerde negatif kullanımı zor insanlar takip etmek için olabilir - Yukarıdaki örneklerin tümünde değiştirerek okumak için basitleştirilmiş böylece idx !== -1 ? x : yiçin idx == -1 ? y : x:

var value = ( ( value = someArray.indexOf(3) ) == -1 ? 0 : value );

97
Bunların hepsi, "huh, sanırım işe yarıyor" diye düşünmeden önce birkaç saniye ona bakmamı sağlayacak bir tür "zeki" kodlama. Açıklığa yardımcı olmazlar ve kod yazıldığından daha fazla okunduğu için bu daha önemlidir.
Gavin S. Yancey

18
@ g.rocket yaklaşımı 1% 100 okunabilir ve nettir ve tekrardan kaçınmak istiyorsanız gitmenin tek yolu (basit yerine karmaşık ve sorunlu bir işlevi çağırıyorsanız bu gerçekten zararlı olabilir indefOf)
edc65

5
Kabul edildi, # 1 çok okunabilir ve sürdürülebilir, diğer ikisi çok fazla değil.
forgivenson

6
# 3 var value = ((value = someArray.indexOf(3)) === -1 ? 0 : value);için virgül kullanmak yerine basitleştirebileceğinize inanıyorum .
IllusiveBrian

2
İkinci örnekte, kendi kendine çalışan anonim işlev , ok işlevinden parantezleri çıkarabilirsiniz. var value = ( x => x !== -1 ? x : 0 ) ( arr.indexOf(3) );çünkü sadece bir parametredir.
Alex Char

54

Sayılar için

Math.max()Fonksiyonu kullanabilirsiniz .

var value = Math.max( someArray.indexOf('y'), 0 );

0İlk sonuca kadar sonucun sınırlarını 0bu durumda olduğundan daha büyük tutacaktır . Ve sonuç ise gelen indexOfolduğunu -1daha büyüktür gibi 0 döndürecektir -1.

Boole'lar ve boole-y değerleri için

JS için özel olarak genel bir AFAIK kuralı yoktur çünkü yanlış değerler nasıl değerlendirilir.

Ancak çoğu zaman size yardımcı olabilecek bir şey veya operatörü ( ||) ise:

// Instead of
var variable = this_one === true ? this_one : or_this_one;
// you can use
var variable = this_one || or_this_one;

Sen, çünkü ilk örnekte, bu çok dikkatli olmak zorunda indexOfdönebilir 0ve değerlendirmek eğer 0 || -1o dönecektir -1çünkü 0bir olduğunu falsy değer.


2
Teşekkürler. Sanırım benim örneğim kötü, sadece genel bir örnek veriyorum haha ​​tam soruya bir çözüm aramıyorum. Üçlü kullanmak istediğim, ancak tekrarladığım örnekte olduğu gibi bazı scnarioslarla karşılaştım :(
user1354934

1
İlk örnekte bunu nasıl belirliyorsunuz 3veya "y"endeksine değildir 0ait someArray?
konuk271314

On Math.maxÖrneğin? indexOföğenin dizinini döndürür ve öğe bulunamazsa -1 döndürür, böylece -1'den dizenin uzunluğuna kadar bir sayı elde etme şansınız olur, ardından Math.maxşansı kaldırmak için sınırları 0'dan uzunluğa ayarlamanız yeterlidir. -1 döndürmek için,
Crisoforo Gaspar

@mitogh OP'deki koddaki mantık bir sorun yaratır, genel bir örnek olsa da; burada 0'ın her ikisi de 0dizi içindeki eşleşen öğenin dizinini gösterebilir ya da 0şu değere ayarlanır Math.max(); veya OP'deki koşullu operatörde. Düşünün var value = Math.max( ["y"].indexOf("y"), 0 ). Hangisinin 0iade edileceğini nasıl belirlersiniz ? çağrıya 0geçildi mi Math.max()yoksa dizi içindeki 0indeksi yansıtan "y"mı?
konuk271314

@ guest271314 İyi düşündüm, ancak bunun bir sorun olup olmadığı bağlamına bağlı olduğunu düşünüyorum. Belki de 0'ın nereden geldiği önemli değildir ve önemli olan tek şey -1 olmamasıdır. Bir örnek: belki bir diziden bir öğe seçmeniz gerekebilir. Belirli bir öğe istiyorsunuz (OP'de, numara 3), ancak bu dizide değilse, yine de bir öğeye ihtiyacınız var ve dizinin olmadığını bildiğinizi varsayarak, ilk öğe ne olursa olsun, varsayılanı seçmekte sorun yok. t boş.
Kev

27

Pek değil, sadece başka bir değişken kullanın.

Örneğiniz böyle bir şeye genelleme yapıyor.

var x = predicate(f()) ? f() : default;

Hesaplanan bir değeri test ediyor, ardından bir koşulu geçmesi durumunda bu değeri bir değişkene atıyorsunuz. Hesaplanan değeri yeniden hesaplamaktan kaçınmanın yolu açıktır: sonucu saklamak için bir değişken kullanın.

var computed = f();
var x = predicate(computed) ? computed : default;

Ne demek istediğini anlıyorum - bunu yapmanın biraz daha temiz görünen bir yolu olmalı gibi görünüyor. Ama bence bunu yapmanın en iyi yolu (deyimsel olarak). Bu kalıbı herhangi bir nedenle kodunuzda çok tekrarlıyorsanız, küçük bir yardımcı işlev yazabilirsiniz:

var setif = (value, predicate, default) => predicate(value) ? value : default;
var x = setif(someArray.indexOf(3), x => x !== -1, 0)

17

DÜZENLEME: İşte şimdi JavaScript'te Nullary-coalescing önerisi !


Kullanım ||

const result = a ? a : 'fallback value';

eşdeğerdir

const result = a || 'fallback value';

Döküm Eğer aiçin Booleangetiri false, resultatanacak 'fallback value', aksi takdirde değeri a.


a === 0Yönlendiren falseve result(yanlış olarak) alacak olan uç durumun farkında olun 'fallback value'. Bunun gibi hileleri kendi sorumluluğunuzda kullanın.


PS. Swift gibi dillerde , benzer amaca hizmet eden sıfır birleştirme operatörü ( ??) vardır. Örneğin, Swift'de result = a ?? "fallback value"JavaScript'e oldukça yakın olanconst result = a || 'fallback value';


3
PHP (> 7.0) ve C # ayrıca boş birleştirme operatörünü de destekler. Sözdizimsel şeker ama kesinlikle güzel.
Hissvard

5
Bu, yalnızca işlev başarısız olduğunda yanlış bir değer döndürdüğünde çalışır, ancak indexOf()bu modelde kullanılamaz.
Barmar

1
Doğru, ama belirli bir örnek istemiyor> "Yine, yukarıdaki soruya bir cevap aramıyor, sadece üçlüde bazı şeyleri tekrar etmiş olabileceğin bir örnek" <, unutmayın ki, tekrarlayan üçlü ile değiştirin (sonuç = a? a: b). Ve tekrarlayan üçlü eşittir || (sonuç = a || b)
Lyubomir

2
Böyle mi gerçekten nasıl ||JavaScript çalışır? Sizi doğru anlıyorsam, diğer birçok birincil dilden farklı çalışır (Öncelikle C ve onun soyundan gelenleri [C ++, Java, vb.] ||Düşünüyorum) JavaScript'te gerçekten böyle çalışsa bile , kullanılmamasını tavsiye ederim. bakımcıların dil hakkında özel tuhaflıklar bilmelerini gerektiren bunun gibi hileler. Bu numara harika olsa da, bunun kötü bir uygulama olduğunu düşünürdüm.
Loduwijk

1
Ayrıca sorunun değeri ile karşılaştırdığına dikkat edin -1. Yine, JavaScript ve tuhaflıkları için konuşamam, ancak genellikle -1gerçek bir değer olur, yanlış değil ve bu nedenle cevabınız sorunun durumunda işe yaramaz ve kesinlikle genel durumda değil, yalnızca belirli bir durumda işe yarar ( ancak yeterince yaygın) alt durum.
Loduwijk

8

Bir ayıklama değişkeni yeniden düzenleme kullanın :

var index = someArray.indexOf(3);
var value = index !== -1 ? index : 0

O bile daha iyidir constyerine var. Ayrıca ek bir ekstraksiyon da yapabilirsiniz:

const index = someArray.indexOf(3);
const condition = index !== -1;
const value = condition ? index : 0;

Uygulamada, daha anlamlı adlar kullanmak index, conditionve value.

const threesIndex = someArray.indexOf(3);
const threeFound = threesIndex !== -1;
const threesIndexOrZero = threeFound ? threesIndex : 0;

Bir "ayıklama değişkeni" nedir? Bu yerleşik bir terim mi?
Peter Mortensen

6

Muhtemelen birleştirme operatörü arıyorsunuz. Neyse ki, Arraybir tane oluşturmak için prototipten faydalanabiliriz :

Array.prototype.coalesce = function() {
    for (var i = 0; i < this.length; i++) {
        if (this[i] != false && this[i] != null) return this[i];
    }
}

[null, false, 0, 5, 'test'].coalesce(); // returns 5

Bu, işleve bir parametre ekleyerek durumunuza daha da genelleştirilebilir:

Array.prototype.coalesce = function(valid) {
    if (typeof valid !== 'function') {
        valid = function(a) {
            return a != false && a != null;
        }
    }

    for (var i = 0; i < this.length; i++) {
        if (valid(this[i])) return this[i];
    }
}

[null, false, 0, 5, 'test'].coalesce(); // still returns 5
[null, false, 0, 5, 'test'].coalesce(function(a){return a !== -1}); // returns null
[null, false, 0, 5, 'test'].coalesce(function(a){return a != null}); //returns false

Dizilerin prototipine eklemek risklidir çünkü yeni öğe her dizinin içinde bir dizin haline gelir. İndekslerle yineleme da yeni bir yöntem içerir bu araçlar: for (let x in ['b','c']) console.log(x);baskılar 0, 1, "coalesce".
Charlie Harding

@CharlieHarding True, ancak diziler arasında döngü oluştururken genellikle for-in operatörünün kullanılması önerilmez. Stackoverflow.com/a/4374244/1486100
Tyzoid'e

6

Şahsen iki çeşidi tercih ediyorum:

  1. @Slebetman'ın önerdiği gibi safsa

  2. Aşağıdaki örnekte olduğu gibi, geçersiz değeri varsayılan değerle değiştiren ayrı işlev:

function maskNegative(v, def) {
  return v >= 0 ? v : def;
}

Array.prototype.indexOfOrDefault = function(v, def) {
  return maskNegative(this.indexOf(v), def);
}

var someArray = [1, 2];
console.log(someArray.indexOfOrDefault(2, 0)); // index is 1
console.log(someArray.indexOfOrDefault(3, 0)); // default 0 returned
console.log(someArray.indexOfOrDefault(3, 123)); // default 123 returned


1
+1, seçenek 2, sorunun satır içi amacına uyar, javascript dışındaki diğer dillere etkili bir şekilde uygulanabilir ve modülerliği destekler.
Devsman

5

@ Slebetman'ın cevabını beğendim. Altındaki yorum, değişkenin "ara durumda" olmasıyla ilgili endişeleri ifade etmektedir. Bu sizin için büyük bir endişeyse, onu bir işlevde özetlemenizi öneririm:

function get_value(arr) {
   var value = arr.indexOf(3);
   if (value === -1) {
     value = 0;
   }
   return value;
}

O zaman sadece ara

var value = get_value( someArray );

Başka yerlerde kullanımlarınız varsa daha genel işlevler yapabilirsiniz, ancak çok özel bir durumsa aşırı mühendislik yapmayın.

Ama dürüst olmak gerekirse, birkaç yerden tekrar kullanmam gerekmedikçe @slebetman olarak yapardım.


4

Sorunuza bakmanın iki yolu var: ya satır uzunluğunu azaltmak istiyorsunuz ya da bir değişkeni üçlüde tekrar etmekten özellikle kaçınmak istiyorsunuz. İlki önemsizdir (ve diğer birçok kullanıcı örnekler yayınlamıştır):

var value = someArray.indexOf(3) !== -1 ? someArray.indexOf(3) : 0;

kısaltılabilir (ve işlev çağrıları verildiğinde) şu şekilde kısaltılabilir:

var value = someArray.indexOf(3);
value = value !== -1 ? value : 0;

Üçlü sayıdaki bir değişkenin tekrarını engelleyen daha genel bir çözüm arıyorsanız, şöyle:

var value = conditionalTest(foo) ? foo : bar;

burada fooyalnızca bir kez görünür. Formun çözümlerini atma:

var cad = foo;
var value = conditionalTest(foo) ? cad : bar;

teknik olarak doğru ama asıl noktayı kaçırırsanız, şansınız kalmaz. Aradığınız kısa sözdizimine sahip operatörler, işlevler ve yöntemler vardır, ancak bu tür yapılar tanım gereği üçlü operatörler değildir .

Örnekler:

javascript, ||LHS aşağıdaki durumlarda RHS'yi döndürmek için kullanılır falsey:

var value = foo || bar; // equivalent to !foo ? bar : foo

1
Soru javascript olarak etiketlenmiştir ve C # 'dan bahsetmez. Sadece neden C # özel örneklerle bitirdiğinizi merak ediyorum.
Loduwijk

Sorudaki javascript etiketini kaçırdım; C # kaldırıldı.
asgallant

3

Yardımcı bir işlev kullanın:

function translateValue(value, match, translated) {
   return value === match ? translated : value;
}

Artık kodunuz çok okunabilir ve tekrar yok.

var value = translateValue(someArray.indexOf(3), -1, 0);

Kodlama endişelerinin hiyerarşisi şudur:

  1. Doğru (gerçek performans veya SLA endişeleri dahil)
  2. Açık
  3. Özlü
  4. Hızlı

Sayfadaki tüm cevaplar şu ana kadar doğru görünüyor, ancak bence benim versiyonum, özlü olmaktan daha önemli olan en yüksek netliğe sahip. Yardımcı işlevi saymazsanız - yeniden kullanılabileceği için - en kısa olanıdır. Bir yardımcı işlevi kullanmak için biraz benzer öneri maalesef bana göre ne yaptığını belirsizleştiren bir lambda kullanıyor. Lambda almayan, sadece değerler alan tek bir amacı olan daha basit bir işlev benim için çok daha iyidir.

PS ES6 sözdizimini seviyorsanız:

const translateValue = (value, match, translated) => value === match ? translated : value;
let value = translateValue(someArray.indexOf(3), -1, 0); // or const

2
"Benim versiyonum en yüksek netliğe sahip" - Katılmıyorum. İşlev adı çok uzun ve parametrelerin giriş ve çıkışını adlandırmak hiç yardımcı olmuyor.
adelphus

Daha iyi isimler önerebilir misin? Onları eğlendirmekten mutlu olurum. Şikayetiniz sadece kozmetik ürünleriyle ilgili, hadi kozmetikleri düzeltelim. Sağ? Aksi takdirde sadece bisiklet döküyorsunuz.
ErikE

Bazı durumlarda, böyle bir yardımcı işlev yararlı olabilir. Bu durumda, yalnızca belirli bir üçlü operatörün yerini aldığı durumda, işleviniz daha az net olacaktır. Fonksiyonunuzun ne yaptığını hatırlamayacağım ve her karşılaştığımda tekrar bakmam gerekecek ve onu kullanmayı asla hatırlamayacağım.
Loduwijk

1
@Aaron Bu, belirli bir kullanım durumu için makul bir değerlendirme. Değeri ne translateValueIfEqualolursa olsun, daha açıklayıcı olduğunu düşündüğüm orijinal işlev adımdı, ancak biri çok uzun olduğunu düşündükten sonra değiştirdim. NzAccess'teki işlev gibi , eğer onu biliyorsanız, bilirsiniz ve bilmiyorsanız bilmiyorsunuz. Modern IDE'lerde, tanıma atlamak için sadece bir tuşa basabilirsiniz. Ve geri dönüş, ara değişken olacaktır. Burada gerçekten büyük bir olumsuzluk görmüyorum.
ErikE

1
Bu sadece aynı soruyu 5 farklı mühendise sorarsanız 10 farklı cevap alacağınızı gösterir.
Loduwijk

2

||Operatörün aşağıdakilere göre uyarlanabileceğini düşünüyorum indexOf:

var value = ((someArray.indexOf(3) + 1) || 1) - 1;

Döndürülen değer 1 yukarı kaydırılır, -1'den 0 yapılır, bu yanlıştır ve bu nedenle ikinci 1 ile değiştirilir. Daha sonra geri kaydırılır.

Ancak, okunabilirliğin tekrardan kaçınmaktan daha üstün olduğunu lütfen unutmayın.


2

Bu, bitsel NOT ile basit bir çözümdür ve varsayılan değeri -1daha sonra sıfıra döner.

index = ~(~array.indexOf(3) || -1);

Temel olarak, orijinal değeri veya bitsel NOT uygulandıktan sonra sıfır döndüren varsayılan değeri döndüren çift bit düzeyinde NOT ile çalışır.

Doğruluk tablosuna bir göz atalım:

 indexOf    ~indexOf   boolean    default     value      result         comment
---------  ---------  ---------  ---------  ---------  ---------  ------------------
      -1          0     falsy          -1         -1          0   take default value
       0         -1    truthy                     -1          0
       1         -2    truthy                     -2          1
       2         -3    truthy                     -3          2

0

Yeniden atamayı kullanabilirsiniz:

  • değişkeni bir değerle başlat
  • Yeniden &&atama için operatörün serileştirmesini kullanın , çünkü ilk koşul yanlışsa, ikinci ifade değerlendirilmeyecektir

Örn.

var value = someArray.indexOf(3);
value == -1 && (value=0);


3
@MinusFour Bir dereceye kadar. Değişken tekrarlanır, ifade someArray.indexOfyalnızca bir kez gerçekleştirilmez
vol7ron

Tekrarlıyorsun value.
Eksi 4

3
@MinusFour Correct, ancak bu daha büyük ifadeler için daha kullanışlıdır, bir değişkeni tekrarlamak, işlemleri kaydetmeye kıyasla önemsizdir. Benim tahminim OP ile çalışmıyor -1ve 0; aksi halde en max()iyi seçenek olurdu
vol7ron

2
Doğru ... ama soru şu ... " Kendini tekrar etmeden üçlüler nasıl yazılır "
EksiDört

4
Ayrıca Again, not seeking an answer to the exact question abovesoruyu yoruma bırakan yazıyor ;)
vol7ron

0

Buna belirlenmiştir olacağını nasıl belli değil Soru de örnek kodlar verilecektir 3veya dizinde ayarlanmamış 0ait someArray. Bu örnekte, eşleşme olabileceği varsayılan bir eşleşmenin hariç tutulması amacıyla -1döndürülen .indexOf()değer değerli olacaktır.

Eğer 3dizide yer almayan, -1iade edilecektir. 1Sonuç .indexOf()olarak değerlendirmek falseiçin sonucuna ekleyebiliriz -1, ardından || ORoperatörü ve 0. Ne zaman valuebaşvuruda bulunulan, çıkarma 1dizi veya bir öğenin dizinini almak için -1.

Bu , bir koşulu basitçe kullanmaya .indexOf()ve kontrol etmeye geri götürür . Ya da, tanımlama olarak orijinal referans ilişkin değerlendirilen durumun fiili sonucu olarak olası karışıklığı önlemek için.-1ifvalueundefined

var someArray = [1,2,3];
var value = someArray.indexOf(3) + 1 || 1;
console.log(value -= 1);

var someArray = [1,2,3];
var value = someArray.indexOf(4) + 1 || 1;
// how do we know that `4` is not at index `0`?
console.log(value -= 1);

var someArray = [1,2,3];
var value = someArray.indexOf(4) + 1 || void 0;
// we know for certain that `4` is not found in `someArray`
console.log(value, value = value || 0);


0

Üçlü bir eğer-değilse gibidir, eğer else bölümüne ihtiyacınız yoksa, bunun yerine neden sadece tek bir tane olmasın?

if ((value = someArray.indexOf(3)) < 0) value = 0;

0

Bu özel durum için, mantıksal ||operatör ile kısa devre yapmayı kullanabilirsiniz . Gibi 0falsy kabul edilir, ekleyebilir 1eğer, bu nedenle, sizin dizine index+1olduğunu 0o zaman mantıksal-veya gibi sonucun sağ tarafını alırsınız aksi takdirde, senin alırsınız, index+1. İstediğiniz sonuç dengelendiğinden , endeksinizi almak için ondan 1çıkartabilirsiniz 1:

const someArray = [1, 2, 3, 4];
const v = ((someArray.indexOf(3)+1) || 1)-1;
console.log(v);

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.