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 false
value.
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é NaN
sã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, 2010
nã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 oor
operador, 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');