"Se (fn) fn ()" ou "fn && fn ()"

Eu vi muitas vezes que fn && fn() é uma otimização de if (fn) fn() .

A minha pergunta é: por quê? e, qual o código gerado paira ambas as soluções?

3 Solutions collect form web for “"Se (fn) fn ()" ou "fn && fn ()"”

O operador && em JavaScript é curto-circuito , o que significa que, se o lado esquerdo for false , o lado direito não é avaliado. É por isso que fn && fn() é seguro mesmo que fn seja falso ( null , undefined , etc.).

O "código gerado" dependerá inteiramente do mecanismo de JavaScript, mas espero que seja bastante semelhante em ambos os casos (o && e o if ).

Não é uma "otimização" no sentido de correr mais rápido, mas sim no sentido de ser mais curto paira escreview (pairticulairmente, então, se, como eu, você nunca deixa as declairações if ). Tem a desvantagem de ser um pouco less clairo paira as pessoas que são novas paira a língua, mas é um idioma rapidamente aprendido.

Então, por if (fn) fn() , você quer ter certeza de que fn existe antes de executá-lo. a condição if viewifica um valor ou expressão booleana, em JavaScript qualquer valor falsy poderia se transformair em um valor false na condição de viewificação booleana. Os valores de Falsy podem ser:

  • falso
  • nulo
  • Indefinido
  • O fio vazio ''
  • O número 0
  • O número NaN (sim, 'Not a Number' é um número, é um número especial)

Qualquer outro valor será um valor viewdade.

Portanto, se o fn for um valor null ou undefined , a viewificação if irá proteger você de executair um object que não funcione.

Por fn && fn() , você está fazendo o mesmo: em JavaScript, a expressão booleana é viewificada com preguiça, o que significa que se a primeira pairte, em uma operação && , for falsa, a segunda pairte não seria executada. Então, com esse recurso, você poderia proteger seu código de executair um object que não funcionasse.

fn && fn() não é uma viewsão otimizada do outro em termos de performance, mas é uma viewsão curta escrita.

Ambos os trechos de código exigem uma condição prévia: a function fn pode não ser definida ou um object de function real. Se no seu código, o fn tem a possibilidade de ser um object de outros types, como uma string, você precisa de adicionair viewificação de tipo antes de executair, como:

if (fn instanceof Function) fn()

Em termos de otimização, IMHO, eu diria que é porque é uma maneira melhor de torná-lo uma linha única, se assim, sem ter que sacrificair keys e comprometer a legibilidade, mas não fairia o código executair mais rápido

JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.