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?

Projektant stron internetowych
źródło

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
Brad Christie
źródło
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;
Adam Rackis
źródło
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.

Tadeck
źródło
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.

Daniel
źródło
2
startingNum = startingNum || 1

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

startingNum = startingNum ? startingNum : null

możesz użyć '&&'

startingNum = startingNum && startingNum
a2441918
źródło
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.

John Pace
źródło
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"
xxjjnn
źródło
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