Skrótowy operator trójskładnikowy Javascript


104

Wiem, że w php 5.3 zamiast używać tej redundantnej składni operatora trójskładnikowego:

startingNum = startingNum ? startingNum : 1

... możemy użyć skróconej składni dla naszych operatorów trójskładnikowych tam, gdzie ma to zastosowanie:

startingNum = startingNum ?: 1

Wiem o operatorze trójskładnikowym w javascript:

startingNum = startingNum ? startingNum : 1

... ale czy istnieje skrót?

Odpowiedzi:


179
var startingNumber = startingNumber || 1;

Coś takiego, czego szukasz, gdzie to jest domyślne, jeśli jest niezdefiniowane?

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

Nawiasem mówiąc, działa to w przypadku wielu scenariuszy, w tym obiektów:

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

Rzeczywiście, podskakiwałem dziś rano. Naprawiono, ale dzięki za zauważenie.
Brad Christie,

1
Czy nie masz na myśli ||zamiast ???
Rocket Hazmat

2
Dzięki! Udało wam się. W tym przypadku używam obiektu. :)
Web_Designer

8
Dla każdego, kto jest ciekawy, to działa, ponieważ ||operator JS nie zwraca prawdy ani fałszu, zwraca pierwszą wartość „prawdziwą”. Załóżmy, że masz val0i val1jak undefined, i val2jest 2, val3jest 3. val0 || val1 || val2 || val3zwróci 2, ponieważ jest to pierwsza „prawdziwa” wartość.
Jake T.

2
Czy ten idiom nie jest anty-wzorcem? Co się stanie, jeśli przekażesz 0 lub pusty ciąg, wyrażenie „OR” pominie je i użyje wartości domyślnej, w której faktycznie chciałeś 0 lub pustego ciągu.
Paul Trzyna

24

|| zwróci pierwszą prawdziwą wartość, którą napotka, i dlatego może być używany jako operator łączenia, podobnie jak w języku C # ??

startingNum = startingNum || 1;

Twoje wyjaśnienie podoba mi się bardziej niż inne
Ajax333221

12

Tak jest:

var startingNum = startingNum || 1;

Ogólnie expr1 || expr2działa w następujący sposób (o czym wspomina dokumentacja ):

Zwraca, expr1jeśli można go przekonwertować na true; w przeciwnym razie zwraca expr2. Tak więc, gdy jest używany z Booleanwartościami, ||zwraca, truejeśli którykolwiek z operandów jest true; jeśli oba są false, zwraca false.


Czy nie lepiej jest powiedzieć if a is truthyvs. if a is evaluated to true?
JaredPar

3
@JaredPar: Aby uniknąć niejednoznaczności, zastąpiłem moje oryginalne szczegółowe wyjaśnienie tym z Mozilla Developer Network. Powinien być mniej niejednoznaczny.
Tadeck

2
var startingNum = startingNum || 1;

W takim przypadku możesz użyć operatora OR.


2
startingNum = startingNum || 1

Jeśli masz warunek z null, na przykład

startingNum = startingNum ? startingNum : null

możesz użyć '&&'

startingNum = startingNum && startingNum

Ale czy nie zostanie anything && nulloszacowany na zero, chyba że anythingjest fałszywy?
Petruza

Tak, jeśli cokolwiek jest prawdą, ocenia się na zero. Jeśli jest fałszywy, zwraca wartość
fałszywą

1

Powyższe odpowiedzi są prawidłowe. W JavaScript następujące oświadczenie:

startingNum = startingNum ? otherNum : 1

można wyrazić jako

startingNum = otherNum || 1

Innym scenariuszem, którego tutaj nie omówiono, jest sytuacja, w której wartość ma zwracać fałsz, gdy nie jest dopasowana. Skrót JavaScript dla tego to:

startingNum = startingNum ? otherNum : 0

Ale można to wyrazić jako

startingNum = startingNum && otherNum

Chciałem tylko opisać inny scenariusz na wypadek, gdyby inni szukali bardziej uogólnionej odpowiedzi.


czy istnieje skrót na coś takiego: x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
oldboy

@Anthony Nie, ponieważ innerWidth * 0.0375 > 24różni się od if trueczęści, która jest innerWidth * 0.0375. Skrót może być używany tylko wtedy, gdy expression to be evaluatedi the if truemają tę samą wartość. To samo, dlaczego nie byłbyś w stanie stenografować x = someBoolean ? 'Heck yea!' : 'No way!'.
deedub

@deedub, właściwie, istnieje „skrót” (jeśli można to tak nazwać), którym byłobyMath.max(innerWidth * 0.0375, 24)
oldboy,

@Anthony Nie nazwałbyś tego tak;) Ale Math.maxdziała lepiej niż operator trójskładnikowy w twoim przypadku użycia.
deedub

1
startingNum = startingNum ? otherNum : 1można wyrazić jako startingNum = otherNum || 1” jest błędne. właśnie to przetestowałem
oldboy

0

Aby utworzyć trójskładnik, taki jak:

boolean_condition ? true_result : false_result

w javascript możesz:

(boolean_condition && true_result ) || false_result;

Przykład:

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

sooo x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24stanie się (innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24?? czy istnieje skrót, więc nie muszę powtarzać innerWidth * 0.0375, poza przypisaniem go do zmiennej ???
oldboy

1
W tym przypadku Math.max( innerWidth * 0.0375 , 24 )działałby elegancko. W bardziej ogólnym przypadku dobrze byłoby utworzyć opisową metodę o nazwie np. „SomethingifiedInnerWidth”, która poprawi czytelność, zamiast tworzyć zmienną. Chociaż w niektórych przypadkach bardziej czytelne byłoby posiadanie zmiennej (o tej opisowej nazwie), więc w przyszłości pytanie „dlaczego jest mnożone przez to?” nie jest podniesiony.
xxjjnn

wow nawet nie wiedział, że możesz podać drugi argument za Math.max. super eleganckie rozwiązanie !!
oldboy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.