« Atribuição de varíavel em uma condição

March 28, 2016 • ☕️ 1 min read

Implementando uma funcionalidade num sistema que ao pressionar determinadas teclas realiza uma validação e que se a tecla UP for pressionada realiza outra validação, resolvi usar atribuição em uma condição para poupar código, acabei descobrindo um bug que explico como resolvi nesse post.

Mapa das teclas:

Número || Tecla
9 || TAB
13 || ENTER
38 || UP KEY
40 || DOWN KEY

script.js

var isUPKey = false;
function validacao (num) {
var keyCode = num;
if(keyCode == 13 || keyCode == 40 || (isUPKey = keyCode == 38)) {
// código omitido
}
console.log(isUPKey);
}
  • Interação #1: validacao(9) // false
  • Interação #2: validacao(38) // true
  • Interação #3: validacao(40) // true

Por que a variável isUPKey está verdadeira? Sendo que o keyCode é 40? Porque deixei a atribuição e a condição no final.

Na segunda iteração isUPKey era verdadeira, já na #3 iteração a segunda condição atendeu ao esperado logo o interpretador não verifica a última a condição. Pois estamos utilizando o operador || (OU) (se encontra um verdadeiro não verifica o restante). Podemos resolver isso de duas formas:

  • Usando o operador && que força todas as condições serem verificadas.
  • Mover a condição pro começo.

Nesse cenário a primeira solução não se adequa, pois não consigo verificar mais de uma tecla por vez.

function validacao () {
if((isUPKey = keyCode == 38) || keyCode == 13 || keyCode == 40) {
// código omitido
}
console.log(isUPKey);
}
validacao(40); // false