O que significa “opções = opções || {} ”Significa em JavaScript?

Eu encontrei um trecho de código outro dia que fiquei curioso, mas não tenho certeza do que realmente faz;

options = options || {}; 

Meu pensamento até agora; define options variables ​​para options de valor se existir, se não, configurada para object vazio.

Sim não?

Isso é útil para definir valores padrão para argumentos de function, por exemplo:

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

Se você chamar test sem argumentos, as options serão inicializadas com um object vazio.

O OR Lógico || operador retornará seu segundo operando se o primeiro for falso .

Os valores de paralisia são: 0 , null , undefined , a string vazia ( "" ), NaN e, é claro, false .

É o padrão padrão ..

O que você tem em seu trecho é a maneira mais comum de implementar o padrão , ele retornará o valor do primeiro operando que produz um valor verdadeiro quando convertido em 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} */ 

o acima é basicamente equivalente a fazer a seguinte alternativa mais detalhada

 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 = {}; 

exemplos de valores gerados pelo operador OR lógico:

 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 -> "!!" 

Como você pode ver, se nenhuma correspondência for encontrada, o valor do último operando será rendimento.


Quando isso é útil?

Existem vários casos, embora o mais popular seja definir o valor padrão dos argumentos da function, como mostrado abaixo:

 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 

Notas

Isto é notavelmente uma das diferenças que o javascript tem comparado a muitas outras linguagens de programação populares.

O operador || não produz implicitamente um valor booleano, mas mantém os tipos de operandos e produz o primeiro que será avaliado como true em uma expressão booleana.

Muitos programadores vindos de linguagens onde este não é o caso (C, C ++, PHP, Python, etc, etc) acham isso bastante confuso a princípio, e é claro que sempre existe o oposto; as pessoas que vêm do javascript ( perl , etc) se perguntam por que esse recurso não é implementado em outro lugar.

Sim. A amostra é equivalente a isso:

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

O operador OR ( || ) entrará em curto e retornará o primeiro valor inicial.

Sim, é exatamente isso que faz.

Encontrei outra variação disso:

 options || (options = {}); 

Parece fazer o mesmo truque.