Dado este trecho de JavaScript ...
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';
var f = a || b || c || d || e;
alert(f); // 4
Alguém pode me explicar como é chamada essa técnica (meu melhor palpite está no título desta pergunta!)? E como / por que funciona exatamente?
Meu entendimento é que a variável f
receberá o valor mais próximo (da esquerda para a direita) da primeira variável que tem um valor que não é nulo ou indefinido, mas não consegui encontrar muito material de referência sobre essa técnica e visto que usava muito.
Além disso, essa técnica é específica para JavaScript? Eu sei que fazer algo semelhante no PHP resultaria em f
ter um verdadeiro valor booleano, e não o valor em d
si.
$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');
$f = $a ?: $b ?: $c;
??
para isso.$a = $b ?? 'default'
$a
será atribuído o valor de$b
se$b
for verdadeiro, outro'default'
?Respostas:
Consulte avaliação de curto-circuito para obter a explicação. É uma maneira comum de implementar esses operadores; não é exclusivo do JavaScript.
fonte
if( true == f )
. Se um número inteiro foi armazenado em f, esse teste sempre retornará falso.if(true == f)
o mesmoif(f)
: o teste será aprovado. Se você também quiser testar o tipo def
, use comparação estrita:, oif(true === f)
que realmente falhará.Isso é feito para atribuir um valor padrão , neste caso o valor de
y
, se ax
variável for falsa .Os operadores booleanos em JavaScript podem retornar um operando, e nem sempre um resultado booleano, como em outros idiomas.
O operador OR lógico (
||
) retorna o valor do seu segundo operando, se o primeiro for falso, caso contrário, o valor do primeiro operando será retornado.Por exemplo:
Falsas valores são aqueles que coerce para
false
quando usado em contexto booleano, e eles são0
,null
,undefined
, uma cadeia vazia,NaN
e, é clarofalse
.fonte
||
exclusivo.&&
operador lógico tem um comportamento semelhante; ele retorna o valor do primeiro operando se for falso e retorna o valor do segundo operando, apenas se o primeiro for verdadeiro , por exemplo,("foo" && "bar") == "bar"
e(0 && "bar") == 0
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 atrue
, oufalse
value.Os seguintes valores são considerados falsos em JavaScript.
""
(cadeia vazia)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.
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: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 enull
é 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"
parab
, uma vez que torna mais fácil para atribuir um valor padrão, em vez de fazer verificações de if-else.Você poderia chamar o exemplo abaixo de exploração desse recurso e acredito que torna o código mais difícil de ler.
Dentro do alerta, verificamos se
messages
é falso e, se sim, avaliamos e retornamosnoNewMessagesText
, caso contrário, avaliamos e retornamosnewMessagesText
. Como é falso neste exemplo, paramos em noNewMessagesText e alertamos"Sorry, you have no new messages."
.fonte
However, it's different to other languages in that it returns the result of the last value that halted the execution, instead of a true, or false value.
As variáveis Javascript não são digitadas; portanto, pode ser atribuído um valor inteiro a f, mesmo que ele tenha sido atribuído por meio de operadores booleanos.
f é atribuído ao valor mais próximo que não é equivalente a false . Portanto, 0, falso, nulo, indefinido, são todos ignorados:
fonte
''
também igual false neste caso.f is assigned the NEAREST value
é um ponto muito importante aqui.||
operador booleano , sendo um operador booleano, tem dois operandos: um lado esquerdo e um lado direito. Se o lado esquerdo da tela||
for verdade , a operação será resolvida para o lado esquerdo e o lado direito será ignorado. Se o lado esquerdo for falso , ele será resolvido para o lado direito. Então,null || undefined || 4 || 0
na verdade resolve paraundefined || 4 || 0
qual resolve para4 || 0
qual resolve4
.Não há mágica nisso. Expressões booleanas como
a || b || c || d
são avaliadas preguiçosamente. O intérprete procura o valor dea
, é indefinido, então é falso, então segue em frente, depois vê ob
que é nulo, o que ainda dá resultado falso, então segue em frente, depois vêc
- a mesma história. Finalmente, ele vêd
e diz 'huh, não é nulo, então eu tenho o meu resultado' e o atribui à variável final.Esse truque funcionará em todas as linguagens dinâmicas que fazem uma avaliação lenta de curto-circuito de expressões booleanas. Em linguagens estáticas, ele não é compilado (erro de tipo). Nas linguagens que estão ansiosas para avaliar expressões booleanas, ele retornará valor lógico (ou seja, verdadeiro neste caso).
fonte
d
será atribuído, independentemente de ter sido nulo / indefinido ou não.||
operador sempre resolve todo o operando do lado direito quando o lado esquerdo é falso. Sendo um operador booleano, ele vê apenas duas entradas: o lado esquerdo e o lado direito. O analisador não os vê como uma série de termos, portanto, na verdade, não para quando encontra o primeiro valor de verdade, a menos que esse valor também seja o operando esquerdo de outro||
.Esta pergunta já recebeu várias boas respostas.
Em resumo, essa técnica está aproveitando um recurso de como o idioma é compilado. Ou seja, o JavaScript "provoca um curto-circuito" na avaliação dos operadores booleanos e retornará o valor associado ao primeiro valor da variável não falsa ou ao que a última variável contiver. Veja a explicação de Anurag sobre esses valores que serão avaliados como falsos.
O uso dessa técnica não é uma boa prática por vários motivos; Contudo.
Recursos documentados: Existe uma alternativa existente que atende a essa necessidade e é consistente em mais idiomas. Este seria o operador ternário:
()? valor 1: valor 2.
O uso do operador ternário exige um pouco mais de digitação, mas distingue claramente entre a expressão booleana que está sendo avaliada e o valor que está sendo atribuído. Além disso, ele pode ser encadeado, para que os tipos de atribuições padrão executadas acima possam ser recriados.
fonte
potentially be targeted for change in the future.
sim, mas eu não se aplica a javascript.a || b || c || d || e
?Retorne o primeiro valor verdadeiro da saída .
Se todos forem falsos, retorne o último valor falso.
Exemplo:-
fonte
Ele está configurando a nova variável (
z
) para o valor dex
se for "verdade" (diferente de zero, um objeto / matriz / função válido / qualquer que seja) ou dey
outra forma. É uma maneira relativamente comum de fornecer um valor padrão, casox
não exista.Por exemplo, se você tiver uma função que aceita um parâmetro de retorno de chamada opcional, poderá fornecer um retorno de chamada padrão que não faça nada:
fonte
Isso significa que se
x
for definido, o valor paraz
seráx
, caso contrário, sey
for definido, seu valor será definido como oz
valor de.é o mesmo que
É possível porque os operadores lógicos no JavaScript não retornam valores booleanos, mas o valor do último elemento necessário para concluir a operação (em uma sentença OR seria o primeiro valor não falso, em uma sentença AND seria o último ) Se a operação falhar,
false
será retornado.fonte
||
operador retornará o segundo valor, independentemente de ser verdade ou não.z
seja definido como o valor dex
se esse valor for verdadeiro . Caso contrário, ele será definido como o valor dey
. Isso significa que, sex
for definido como, por exemplo,0
ou a sequência vazia""
, isso não fará o que você diz, pois esses valores são falsos .É o chamado operador de curto-circuito.
A avaliação de curto-circuito diz que o segundo argumento é executado ou avaliado apenas se o primeiro argumento não for suficiente para determinar o valor da expressão. quando o primeiro argumento da função OR (||) é avaliado como verdadeiro, o valor geral deve ser verdadeiro.
Também pode ser usado para definir um valor padrão para o argumento da função.`
fonte
Ele avaliará X e, se X não for nulo, a cadeia vazia ou 0 (falso lógico), será atribuído a z. Se X for nulo, a cadeia vazia ou 0 (falso lógico), ele atribuirá y a z.
Produzirá 'bob';
fonte
false
, mas matrizes ou objetos vazios são coerentes comtrue
.De acordo com a publicação no blog de Bill Higgins ; o idioma lógico de atribuição OU do Javascript (fevereiro de 2007), esse comportamento é verdadeiro a partir da v1.2 (pelo menos)
Ele também sugere outro uso para ele (citado): " leve normalização das diferenças entre navegadores "
fonte