Há um ano, mudei de linguagens OO clássicas, como Java, para JavaScript. O código a seguir definitivamente não é recomendado (ou mesmo incorreto) em Java:
if(dayNumber = getClickedDayNumber(dayInfo))
{
alert("day number found : " + dayNumber);
}
function getClickedDayNumber(dayInfo)
{
dayNumber = dayInfo.indexOf("fc-day");
if(dayNumber != -1) //substring found
{
//normally any calendar month consists of "40" days, so this will definitely pick up its day number.
return parseInt(dayInfo.substring(dayNumber+6, dayNumber+8));
}
else return false;
}
Basicamente, acabei de descobrir que posso atribuir uma variável a um valor em uma instrução da condição if e verificar imediatamente o valor atribuído como se fosse booleano.
Para uma aposta mais segura, normalmente separo isso em duas linhas de código, atribuo primeiro e depois verifico a variável, mas agora que descobri isso, estou apenas me perguntando se é uma boa prática ou não aos olhos dos desenvolvedores de JavaScript experientes.
javascript
Michael Mao
fonte
fonte
"The following code is definitely not recommended (or event not correct) in Java..."
Está correto em JavaScript? Porque, pelo que eu posso ver, você retorna um inteiro (return parseInt(...)
) sedayNumber != -1
for verdadeiro, mas um booleano se for falso.Respostas:
Eu não recomendaria. O problema é que parece um erro comum quando você tenta comparar valores, mas usa um único em
=
vez de==
ou===
. Por exemplo, quando você vê isto:você não sabe se é isso que eles pretendiam fazer ou se pretendiam escrever isto:
Se você realmente quiser fazer a atribuição no local, recomendo fazer uma comparação explícita também:
fonte
if (resultArr = myNeedle.exec(myHaystack)) {...}
funcione,if ((resultArr = myNeedle.exec(myHaystack)) === true) {...}
não funciona porque a atribuição a resultArr é sempre verdadeira, mesmo quando o resultado da função não é. Se alguém usar esta construção .., lembre-se de declarar a variável de resultado primeiro; 'var' não é válido na instrução da condição if.if (!!(value = someFunction()))
, mas como disse, o problema é que você não pode usarvar
dentro,if
então você acaba criando um global ou não consegue nada, pois você precisa declararvalue
em uma linha separada de qualquer maneira. Pena, gostei muito dessa construção em C ++.true
apenas quando a função retornatrue
, mas em todos os outros casos (incluindo quando uma matriz, string, número ou nulo é retornada) ela avalia comofalse
.Não vejo prova de que não seja uma boa prática. Sim, pode parecer um erro, mas isso é facilmente remediado por comentários criteriosos. Tomemos por exemplo:
Por que essa função deve ser executada uma segunda vez com:
Porque a primeira versão PARECE ruim? Não posso concordar com essa lógica.
fonte
x = processorItensiveFunction(); if(x) { alert(x); }
if ( ! x = anyFunction() )
não é legível? Não precisa de nenhum comentário.if-else
situação. Considere-if (condition) {...} else if (x = processorIntensiveFunction()) {alert(x)}
Seu anteriorx = processorIntensiveFunction();
seria um esforço perdido se o inicialcondition
fosse verdadeiro.Eu fiz isso muitas vezes. Para ignorar o aviso de JavaScript, adiciono dois parênteses:
Você deve evitá-lo, se você realmente deseja usá-lo, escreva um comentário acima dele dizendo o que está fazendo.
fonte
if ((a = [1, 2]).length > 0) { console.log(a); }
wherea
não foi inicializado em nenhum lugar ainda e realmente funcionou (bom! Torna o uso de regex muito mais fácil). É correto que eu não preciso de nadavar|const|let
aqui? Por acaso você sabe onde eu poderia ler mais sobre esse truque ?Você também pode fazer isso em Java. E não, não é uma boa prática. :)
(E use o
===
em Javascript para a igualdade de tipos. Leia o livro The Good Parts de Crockford sobre JS.)fonte
if (foo = getSomeBoolValue()) { }
Há um caso em que você faz isso, com
while
-loops.Ao ler arquivos, você geralmente faz assim:
Observe o
while
-loop na linha 9. Lá, uma nova linha é lida e armazenada em uma variável e, em seguida, o conteúdo do loop é executado. Eu sei que isso não é umif
afirmação, mas acho que um loop while também pode ser incluído em sua pergunta.A razão para isso é que, ao usar um
FileInputStream
, toda vez que você chamaFileInputStream.readLine()
, ele lê a próxima linha no arquivo, então se você o tivesse chamado do loop apenasfileIn.readLine() != null
sem atribuir a variável, em vez de chamar(currentLine = fileIn.readLine()) != null
, e depois chamado de dentro do loop também, você obteria apenas cada segunda linha.Espero que você entenda e boa sorte!
fonte
Você também pode fazer atribuições em instruções if em Java. Um bom exemplo seria ler e escrever algo:
http://www.exampledepot.com/egs/java.io/CopyFile.html?l=new
O código:
fonte
Se você fosse consultar o livro de Martin Fowlers Refactoring, melhorando o design do código existente ! Então, há vários casos em que seria uma boa prática, por exemplo. condicionais complexos longos para usar uma chamada de função ou método para afirmar seu caso:
E sim, sua resposta também é válida para implementações Java. Ele não atribui a função condicional a uma variável nos exemplos.
fonte
Não é uma boa prática. Você logo ficará confuso sobre isso. Parece semelhante a um erro comum: uso indevido dos operadores "=" e "==".
Você deve dividi-lo em 2 linhas de códigos. Isso não apenas ajuda a tornar o código mais claro, mas também facilita a refatoração no futuro. Imagine que você muda a condição IF? Você pode acidentalmente remover a linha e sua variável não obter mais o valor atribuído a ela.
fonte
Eu consideraria isso mais um estilo C da velha escola; não é uma prática muito boa em JavaScript, portanto, você deve evitá-la.
fonte
você poderia fazer algo assim:
fonte
Eu vim de Golang, onde é comum ver algo como
Em que
err
tem como escopoif
apenas aquele bloco. Como tal, aqui está o que estou fazendo no es6, o que parece muito feio, mas não faz com que minhas regras bastante rígidas do eslint passem despercebidas e alcança o mesmo.As chaves extras definem um novo, uh, "escopo léxico"? O que significa que posso usar
const
eerr
não está disponível para o bloco externo.fonte