Javacript usa avaliação de curto-circuito para operadores lógicos ||e &&. No entanto, é diferente de outros idiomas, pois retorna o resultado do último valor que interrompeu a execução, em vez de a true, ou falsevalue.
Os seguintes valores são considerados falsos em JavaScript.
- falso
- nulo
"" (cadeia vazia)
- 0 0
- Nan
- Indefinido
Ignorando as regras de precedência do operador e simplificando, os exemplos a seguir mostram qual valor interrompeu a avaliação e é retornado como resultado.
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
Os primeiros 5 valores até NaNsão falsos, portanto, todos são avaliados da esquerda para a direita, até atingir o primeiro valor de "Hello"verdade - o que torna toda a expressão verdadeira, para que qualquer coisa acima não seja avaliada e "Hello"retorne como resultado da expressão . Da mesma forma, neste caso:
1 && [] && {} && true && "World" && null && 2010 // null
Os 5 primeiros valores são todos verdadeiros e são avaliados até atingir o primeiro valor falso ( null) que torna a expressão falsa, portanto, 2010não é mais avaliada e nullé retornada como resultado da expressão.
O exemplo que você deu está usando essa propriedade do JavaScript para executar uma atribuição. Pode ser usado em qualquer lugar em que você precise obter o primeiro valor de verdade ou falsidade entre um conjunto de valores. Este código abaixo irá atribuir o valor "Hello"para b, uma vez que torna mais fácil para atribuir um valor padrão, em vez de fazer verificações de if-else.
var a = false;
var b = a || "Hello";
Você poderia chamar o exemplo abaixo de exploração desse recurso e acredito que torna o código mais difícil de ler.
var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
Dentro do alerta, verificamos se messagesé falso e, se sim, avaliamos e retornamos noNewMessagesText, caso contrário, avaliamos e retornamos newMessagesText. Como é falso neste exemplo, paramos em noNewMessagesText e alertamos "Sorry, you have no new messages.".
$f=$a or $f=$b or $f=$c; // etc. O PHP possui o||operador e ooroperador, que fazem o mesmo trabalho; no entanto,oré avaliado após a atribuição, enquanto||é avaliado antes. Isso também lhe dá o estilo perlish de$a=getSomething() or die('oops');