Cosa significa “opzioni = opzioni || {} “Significa in Javascript?

L’altro giorno mi sono imbattuto in un frammento di codice di cui mi sono incuriosito, ma non sono proprio sicuro di quello che effettivamente fa;

options = options || {}; 

Il mio pensiero finora; imposta le options variabili per valutare le options se esiste, in caso contrario, imposta su object vuoto.

Si No?

Questo è utile per impostare i valori predefiniti per gli argomenti della funzione, ad esempio:

 function test (options) { options = options || {}; } 

Se chiami test senza argomenti, le options saranno inizializzate con un object vuoto.

L’OR logico || l’operatore restituirà il suo secondo operando se il primo è falso .

I valori di Falsy sono: 0 , null , undefined , la stringa vuota ( "" ), NaN , e ovviamente false .

È il modello predefinito ..

Quello che hai nel tuo snippet è il modo più comune per implementare il modello predefinito , restituirà il valore del primo operando che produce un valore vero quando viene convertito in booleano.

 var some_data = undefined; var some_obj_1 = undefined; var some_obj_2 = {foo: 123}; var str = some_data || "default"; var obj = some_obj1 || some_obj2 || {}; /* str == "default", obj == {foo: 123} */ 

quanto sopra è fondamentalmente equivalente a fare la seguente alternativa più verbosa

 var str = undefined; var obj = undefined; if (some_data) str = some_data; else str = "default"; if (some_obj1) obj = some_obj1; else if (some_obj2) obj = some_obj2; else obj = {}; 

esempi di valori forniti dall’operatore logico OR:

 1 || 3 -> 1 0 || 3 -> 3 undefined || 3 -> 3 NaN || 3 -> 3 "" || "default" -> "default" undefined || undefined -> undefined false || true -> true true || false -> true null || "test" -> "test" undefined || {} -> {} {} || true -> {} 

 null || false || {} -> {} 0 || "!!" || 9 -> "!!" 

Come puoi vedere, se non viene trovata alcuna corrispondenza, il valore dell’ultimo operando è yield.


Quando è utile?

Ci sono diversi casi, anche se il più popolare è quello di impostare il valore predefinito degli argomenti della funzione, come nel seguito:

 function do_something (some_value) { some_value = some_value || "hello world"; console.log ("saying: " + some_value); } ... do_something ("how ya doin'?"); do_something (); 

 saying: how ya doin'? saying: hello world 

Gli appunti

Questo è in particolare una delle differenze che javascript ha rispetto a molti altri linguaggi di programmazione popolari.

L’operatore || non fornisce implicitamente un valore booleano ma mantiene i tipi di operando e produce il primo che valuterà in vero in un’espressione booleana.

Molti programmatori che provengono da lingue in cui questo non è il caso (C, C ++, PHP, Python, ecc. Ecc.) Trovano questo piuttosto confuso all’inizio, e ovviamente c’è sempre il contrario; le persone provenienti da javascript ( perl , ecc.) si chiedono perché questa funzione non sia implementata altrove.

Sì. Il campione è equivalente a questo:

 if (options) { options = options; } else { options = {}; } 

L’operatore OR ( || ) eseguirà un cortocircuito e restituirà il primo valore di verità.

Sì, è esattamente quello che fa.

Trovato un’altra variazione di questo:

 options || (options = {}); 

Sembra fare lo stesso trucco.