Operatore ternario stenografico Javascript


102

So che in php 5.3 invece di usare questa sintassi ridondante dell'operatore ternario:

startingNum = startingNum ? startingNum : 1

... possiamo usare una sintassi abbreviata per i nostri operatori ternari ove applicabile:

startingNum = startingNum ?: 1

E so dell'operatore ternario in javascript:

startingNum = startingNum ? startingNum : 1

... ma c'è una stenografia?

Risposte:


175
var startingNumber = startingNumber || 1;

Qualcosa del genere quello che stai cercando, dove è predefinito se non definito?

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

A proposito, funziona per molti scenari, inclusi gli oggetti:

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

In effetti, stamattina sono rimbalzato. Risolto, ma grazie per averlo notato.
Brad Christie

1
Non intendi ||invece di ???
Rocket Hazmat

2
Grazie! L'hai inchiodato. In realtà sto usando un oggetto in questo caso. :)
Web_Designer

8
Per chiunque sia curioso, questo funziona perché l' ||operatore di JS non restituisce vero o falso, restituisce il primo valore "vero". Dì che hai val0e val1come undefined, ed val2è 2, val3è 3. val0 || val1 || val2 || val3tornerà 2, in quanto è il primo valore "veritiero".
Jake T.

2
Non è questo idioma un anti-pattern? Cosa succede se si passa 0 o una stringa vuota, l'espressione "OR" la salterà e utilizzerà il valore predefinito in cui si desidera effettivamente 0 o una stringa vuota.
Paul Trzyna

24

|| restituirà il primo valore di verità che incontra e può quindi essere utilizzato come operatore di coalescenza, simile a C # ??

startingNum = startingNum || 1;

Mi piace la tua spiegazione più delle altre
ajax333221

12

Si C'è:

var startingNum = startingNum || 1;

In generale, expr1 || expr2funziona nel modo seguente (come menzionato dalla documentazione ):

Restituisce expr1se può essere convertito in true; in caso contrario, ritorna expr2. Pertanto, se utilizzato con Booleanvalori, ||restituisce truese uno degli operandi è true; se lo sono entrambi false, restituisce false.


Non è più corretto dire if a is truthyvs. if a is evaluated to true?
JaredPar

3
@ JaredPar: Per evitare ambiguità, ho sostituito la mia spiegazione dettagliata originale con quella di Mozilla Developer Network. Dovrebbe essere meno ambiguo.
Tadeck

2
var startingNum = startingNum || 1;

In questo caso, puoi utilizzare l'operatore OR.


2
startingNum = startingNum || 1

Se hai una condizione con null, come

startingNum = startingNum ? startingNum : null

Puoi usare '&&'

startingNum = startingNum && startingNum

Ma non anything && nullvaluterà nulla a meno che non anythingsia falso?
Petruza

Sì, se qualcosa è vero, vale nulla. Se è falso, restituisce il valore
falso

1

Le risposte precedenti sono corrette. In JavaScript, la seguente dichiarazione:

startingNum = startingNum ? otherNum : 1

può essere espresso come

startingNum = otherNum || 1

Un altro scenario non trattato qui è se si desidera che il valore restituisca falso quando non corrisponde. La scorciatoia JavaScript per questo è:

startingNum = startingNum ? otherNum : 0

Ma può essere espresso come

startingNum = startingNum && otherNum

Volevo solo coprire un altro scenario nel caso in cui altri cercassero una risposta più generalizzata.


c'è una scorciatoia per qualcosa di simile: x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
oldboy

@Anthony No, perché è innerWidth * 0.0375 > 24diverso dalla if trueparte che è innerWidth * 0.0375. L'abbreviazione può essere utilizzata solo se il expression to be evaluatede il if truesono lo stesso valore. Lo stesso per cui non saresti in grado di stenografare x = someBoolean ? 'Heck yea!' : 'No way!'.
deedub

@deedub beh, in realtà, c'è una "scorciatoia" (se la chiami così) che sarebbeMath.max(innerWidth * 0.0375, 24)
oldboy

@Anthony Non lo chiameresti così;) Ma Math.maxfunziona meglio di un operatore ternario nel tuo caso d'uso.
deedub

1
" startingNum = startingNum ? otherNum : 1può essere espresso come startingNum = otherNum || 1" è sbagliato. Ho appena provato questo
oldboy

0

Per fare un ternario come:

boolean_condition ? true_result : false_result

in javascript, puoi fare:

(boolean_condition && true_result ) || false_result;

Esempio:

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

mooolto x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24diventerebbe (innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24?? c'è una scorciatoia, quindi non devo ripetere innerWidth * 0.0375, a parte assegnarla a una variabile ???
oldboy

1
In questo caso, Math.max( innerWidth * 0.0375 , 24 )funzionerebbe elegantemente. Per un caso più generale, sarebbe bene creare un metodo descrittivo chiamato ad esempio "somethingifiedInnerWidth" che migliora la leggibilità, piuttosto che creare una variabile. Sebbene in alcuni casi sarebbe più leggibile avere una variabile (con quel nome descrittivo), quindi in futuro la domanda "perché viene moltiplicata per questo?" non è sollevato.
xxjjnn

wow non sapevo nemmeno che tu potessi fornire un secondo argomento per Math.max. soluzione super elegante !!
oldboy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.